質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

1回答

699閲覧

editアクションがうまく機能しない

keisuke.F

総合スコア19

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/09/09 05:22

編集2020/09/09 05:35

お世話になっております。
現在、チーム開発でフリマアプリを作成しております。

そこで、商品編集機能を実装しているのですが、コントローラーがうまく機能しません。

編集が画面にて、submitの更新するをクリックすると、内容が更新され、rootパスに飛ぶ挙動が期待されるべきなのですが、リロードされ、URLが下記の様になります。

http://localhost:3000/items/1/edit?utf8=%E2%9C%93&_method=patch&authenticity_token=buicDNKYr1KCEvZpzfB%2B2xu8OGGGS2G%2FQ4m%2BDiCQxZ8eJllVj9kvhYSk0koTqH9rpytE%2FuC5BHRdzSwuKHIQ4Q%3D%3D&item%5Bcategory_id%5D=8&item%5Bbrand%5D=&item%5Bname%5D=%E3%81%82%E3%81%82%E3%81%95%E3%81%82&item%5Bitem_explanation%5D=111111&item%5Bshippingarea_id%5D=1&item%5Bitemcondition_id%5D=1&item%5Bshippingcost_id%5D=1&item%5Bshippingday_id%5D=1&item%5Bshippingmethod_id%5D=1&item%5Bprice%5D=1&item%5Bitem_imgs_attributes%5D%5B0%5D%5Bimage%5D=&item%5Bitem_imgs_attributes%5D%5B0%5D%5B_destroy%5D=0&item%5Bitem_imgs_attributes%5D%5B0%5D%5Bid%5D=1&item%5Bitem_imgs_attributes%5D%5B1%5D%5Bimage%5D=&commit=%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B

更新するを押す前は下記のURLです

http://localhost:3000/items/1/edit

データも更新されておらず、notice: '編集できませんでした'と設定しているのですが、出てこないため、updateアクションは機能していないと思います。

items_controller.rb

def edit @item = Item.find(params[:id]) end def update if @item.user_id == current_user.id if @item.update(item_params) redirect_to root_path, notice:'更新しました' else redirect_to(edit_item_path, notice: '編集できませんでした') end end end

#仮説とやったこと
editアクションの@item = Item.find(params[:id])下にbinding.pryをかけ、編集したところ、編集内容は取得できました。

paramsと打つと、
文末に

permitted: false>

という風に表示されています。
(これの原因はよくわかっていません。)

しかし、それ以降のupdateの記述に間違いがあるとは思えず、困惑しております。

この記述で間違っていないと思うのですが、ご教授いただけると幸いです。
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/09/09 05:25

「うまく機能しない」とは、「どのような操作」をしたときに「どんな挙動」が期待されるけれど、実際は「どうなっている」状況なのでしょうか?
keisuke.F

2020/09/09 05:31

編集しました。 情報不足でした、申し訳ないです。 よろしくお願い致します。
guest

回答1

0

リロードされ、URLが下記の様になります。

単純に、フォームでPOSTすべき内容をGETで送信してしまっているだけのように見受けられます。おそらく、フォームの問題です。

投稿2020/09/09 06:52

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

keisuke.F

2020/09/09 07:11 編集

ご回答ありがとうございます。 rails routesをしたところ、おっしゃるとおり、GETになっていました。 現在ルーティングが下記の様になっているのですが、 ``` Rails.application.routes.draw do devise_for :users, controllers: { registrations: 'users/registrations' } devise_scope :user do get 'users/new_address', to: 'users/registrations#new_address' post 'users/create_address', to: 'users/registrations#create_address' end resources :users, only: [:show] root 'items#index' resources :categories, only: [:index, :show] resources :items #get 'items',to: 'categories/show' resources :creditcards, only: [:index, :new, :create, :show, :destroy] do member do post 'pay' end end end ``` resources :itemsの下に post 'items',to: 'items/edit' を記述したところ、 ``` LoadError cannot load such file -- /app_name/config/routes.rb ``` と初見のエラーというか、的外れなエラーを吐きます。 これは、記述の仕方や理解が間違っているのでしょうか。
maisumakun

2020/09/09 07:21

> resources :itemsの下に post 'items',to: 'items/edit' を記述したところ、 不要です。「resources :items」でupdateへのルーティングも引かれていますので、そこへ送信してください。
keisuke.F

2020/09/09 07:28

承知いたしました。 しかしながら、送信してくださいという意味が、理解できません汗 調べても、どこを編集するべきかがわからないです...。
maisumakun

2020/09/09 07:31

編集すべきはフォームのほうかと思いますが、全く提示されていないので提案のしようがありません。
keisuke.F

2020/09/09 08:00 編集

申し訳ないです。 下記がedit.html.hamlです。 ``` .header = render "header" .sell-new .sell-new__wrapper .sell-new__wrapper__nav .sell-new__wrapper__form .sell-new__wrapper__form__set %form#new_item.new_item = form_for @item do |f| %ul - # errorsに入っているエラー内容を出力する - @item.errors.full_messages.each do |message| %li= message .field = f.label :"カテゴリー" %span.attention 必須 %br/ = f.collection_select :category_id, Category.all, :id, :name %br/ .field = f.label :"ブランド" 任意 %br/ = f.text_field :brand, placeholder: '例)シャネル' %br/ .field = f.label :"商品名" %span.attention 必須 %br/ = f.text_field :name, placeholder: '40文字以内' %br/ .field = f.label :"商品説明" %span.attention 必須 %br/ = f.text_field :item_explanation, placeholder: '1000文字以内' %br/ .field = f.label :"発送元地域" %span.attention 必須 %br/ = f.collection_select :shippingarea_id, Shippingarea.all, :id, :name %br/ .field = f.label :"商品状態" %span.attention 必須 %br/ = f.collection_select :itemcondition_id, Itemcondition.all, :id, :name %br/ .field =f.label :"配送料の負担" %span.attention 必須 %br/ = f.collection_select :shippingcost_id, Shippingcost.all, :id, :name %br/ .field = f.label :"発送までの日数" %span.attention 必須 %br/ = f.collection_select :shippingday_id, Shippingday.all, :id, :name %br/ .field = f.label :"配送方法" %span.attention 必須 %br/ = f.collection_select :shippingmethod_id, Shippingmethod.all, :id, :name %br/ .field = f.label :"価格" %span.attention 必須 %br/ = f.number_field :price %br/ .filed = f.label :"商品の画像" %span.attention 必須 #image-box #previews - if @item.persisted? - @item.item_imgs.each_with_index do |image, i| = image_tag image.image.url, data: { index: i }, width: "100", height: '100' = f.fields_for :item_imgs do |image| .js-file_group{"data-index" => "#{image.index}"} = image.file_field :image, class: 'js-file' %br/ %span.js-remove 添付した画像を削除 - if @item.persisted? = image.check_box :_destroy, data:{ index: image.index }, class: 'hidden-destroy' - if @item.persisted? .js-file_group{"data-index" => "#{@item.item_imgs.count}"} = file_field_tag :image, name: "item[item_imgs_attributes][#{@item.item_imgs.count}][image]", class: 'js-file' .js-remove 添付した画像を削除 .button = f.submit "更新する" = render 'items/btmDl' .footer = render partial: 'items/footer' ``` よろしくお願い致します。
maisumakun

2020/09/09 08:02

> %form#new_item.new_item = form_for @item do |f| form_for自体が<form>を生成しますので、さらにformを重ねてはいけません(form_forだけにしてください)。
keisuke.F

2020/09/09 08:08

修正しました。
keisuke.F

2020/09/09 08:08

しかし現状ですが、GETからPOSTに変更できておりません。 ご教授よろしくお願い致します。
maisumakun

2020/09/09 08:11

実際に生成されたHTMLでは、<form>の部分はどの様になっていますか?
maisumakun

2020/09/09 08:27 編集

いえ、そういう意味じゃなくて、「HTMLコードが」どうなっているかのほうです。
keisuke.F

2020/09/09 08:29

失礼しました。 .sell-new__wrapper__form__set = form_for @item do |f| %ul - # errorsに入っているエラー内容を出力する - @item.errors.full_messages.each do |message| %li= message .field = f.label :"カテゴリー" %span.attention 必須 %br/ = f.collection_select :category_id, Category.all, :id, :name %br/ .field = f.label :"ブランド" 任意 %br/ = f.text_field :brand, placeholder: '例)シャネル' %br/ .field = f.label :"商品名" %span.attention 必須 %br/ = f.text_field :name, placeholder: '40文字以内' %br/ .field = f.label :"商品説明" %span.attention 必須 %br/ = f.text_field :item_explanation, placeholder: '1000文字以内' %br/ .field = f.label :"発送元地域" %span.attention 必須 %br/ = f.collection_select :shippingarea_id, Shippingarea.all, :id, :name %br/ .field = f.label :"商品状態" %span.attention 必須 %br/ = f.collection_select :itemcondition_id, Itemcondition.all, :id, :name %br/ .field =f.label :"配送料の負担" %span.attention 必須 %br/ = f.collection_select :shippingcost_id, Shippingcost.all, :id, :name %br/ .field = f.label :"発送までの日数" %span.attention 必須 %br/ = f.collection_select :shippingday_id, Shippingday.all, :id, :name %br/ .field = f.label :"配送方法" %span.attention 必須 %br/ = f.collection_select :shippingmethod_id, Shippingmethod.all, :id, :name %br/ .field = f.label :"価格" %span.attention 必須 %br/ = f.number_field :price %br/ .filed = f.label :"商品の画像" %span.attention 必須 #image-box #previews - if @item.persisted? - @item.item_imgs.each_with_index do |image, i| = image_tag image.image.url, data: { index: i }, width: "100", height: '100' = f.fields_for :item_imgs do |image| .js-file_group{"data-index" => "#{image.index}"} = image.file_field :image, class: 'js-file' %br/ %span.js-remove 添付した画像を削除 - if @item.persisted? = image.check_box :_destroy, data:{ index: image.index }, class: 'hidden-destroy' - if @item.persisted? .js-file_group{"data-index" => "#{@item.item_imgs.count}"} = file_field_tag :image, name: "item[item_imgs_attributes][#{@item.item_imgs.count}][image]", class: 'js-file' .js-remove 添付した画像を削除 .button = f.submit "更新する" この様になっています。
maisumakun

2020/09/09 08:32 編集

それでもなくて、「ブラウザに出力されたHTMLのコード」がどうなっているか確認したいのです。
maisumakun

2020/09/09 08:38

おかしいですね…このままフォームを送信すればきちんとupdateに流れるはずです。 JavaScriptが影響している、ということは考えられませんか?
keisuke.F

2020/09/09 08:43

js部分をコメントアウトしてトライしてみましたが、現状は何も変わりませんでした.....。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問