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

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

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

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

Ruby on Rails

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

Q&A

1回答

170閲覧

editをしても情報が引き継がれていないのを解決したい

KOO_

総合スコア58

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2019/07/07 08:50

こんばんわ。現在1:nで組んだn側のアソシエーションにedit機能を付けたいです。

色々試してみみて、editにアクセスする事までは出来たのですが、元のformの内容がedit引き継がれません。そのまま登録するとupdateではなくcreateされ、新たにeachが追加されてしまう状態です。

ご教示よろしくお願い致します。

companiesshow

1 <table class="company"> 2 <tbody> 3 <% if @company.blocks.any? %> 4 <% @company.blocks.each do |block| %> 5 <tr> 6  <td><%= block.name %></td> 7 <td><%= block.progress %></td> 8 <td><%= block.start %></td> 9 <td><%= block.supply %></td> 10 <td><%= block.comment %></td> 11 <td><%= link_to '編集', edit_mypage_company_block_path(@company, block), class: :"btn btn-primary"%> 12 <%= link_to '削除', 13 mypage_company_block_path(company_id: @company.id, id: block.id), 14 method: :delete, 15 class: :"btn btn-primary", 16 data: { confirm: '本当に削除しますか?'} %></td> 17 <% end %> 18 <% end %> 19 </tr> 20 <%= form_for ([:mypage, @company, @company.blocks.build]) do |f| %> 21 <tr> 22 <td><%= f.select(:name, [ 23 ["トライアル"], 24 ]) %></td> 25 <td><%= f.select(:progress, [ 26 ["1.申込フォーム到着","1.申込フォーム到着"] 27 ]) %></td> 28 <td><%= f.date_field :start %></td> 29 <td><%= f.date_field :supply %></td> 30 <td width="30%" colspan="2"><%= f.text_field :comment %></td> 31 </tr> 32 <tr> 33 <td colspan ="7"><%= f.submit '登録' %></td> 34 </tr> 35 </tbody> 36 </table> 37 <% end %>

blocksedit

1 2<table class="company"> 3 <tbody> 4 5<%= form_for ([:mypage, @company, @company.blocks.build]) do |f| %> 6 <tr> 7 <td><%= f.select(:name, [ 8 ["一般トライアルコース"] 9 ]) %></td> 10 <td><%= f.select(:progress, [ 11 ["1.申込フォーム到着","1.申込フォーム到着"], 12 ]) %></td> 13 <td><%= f.date_field :start %></td> 14 <td><%= f.date_field :supply %></td> 15 </tr> 16 <tr> 17 <th colspan="4">コメント</th> 18 </tr> 19 <tr> 20 <td colspan="4"><%= f.text_area :comment %></td> 21 </tr> 22 <tr> 23 <td colspan ="7"><%= f.submit '登録' %></td> 24 </tr> 25</tbody> 26</table> 27<% end %> 28

blockscontroller

1class Mypage::BlocksController < Mypage::BaseController 2 #before_action :load_company 3# before_action :load_block, only: [:edit,:update,:show,:destroy] 4 5 # def load_company 6 # @company = Company.find(params[:company_id]) 7 # end 8 9 # def load_block 10 # @block = Block.find(params[:id]) 11 # end 12 13 def create 14 @block = Block.build 15 #@company = Company.find(params[:company_id]) 16 if @company.blocks.create(block_params) 17 redirect_to mypage_company_path(@company) 18 end 19 end 20 21 def edit 22 @company = Company.find(params[:company_id]) 23 #@block = Block.find(params[:id]) 24 end 25 26 def update 27 @block = Block.find(params[:id]) 28 #@block = @company.blocks.find(params[:id]) 29 if @block.update(block_params) 30 redirect_to mypage_company_path(@company) 31 else 32 render 'edit' 33 end 34 end 35 36 def destroy 37 @company = Company.find(params[:company_id]) 38 @block = @company.blocks.find(params[:id]) 39 @block.destroy 40 redirect_to mypage_company_path(@company) 41 end 42 43 private 44 def block_params 45 params.require(:block).permit( 46 :name, 47 :system, 48 :progress, 49 :start, 50 :supply, 51 :comment 52 ) 53 end 54 55 end 56

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

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

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

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

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

guest

回答1

0

<%= form_for ([:mypage, @company, @company.blocks.build]) do |f| %>

この時点で、@company.blocks.buildと空のインスタンスを生成してるので、自動的にcreateアクションに飛んでしまうかと思います。

なので、form_forに入る@companyが単一データの場合(@company=Company.find(1)とか)であればupdateアクションに遷移してくれると思います。

また、コントローラ部分のdef updateに関しては

@company.update(message_params)

で良さそうですが、@blockはform_forで使用していませんし、何かの名残でしょうか?

投稿2019/07/07 09:14

bamboo-nova

総合スコア1408

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

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

KOO_

2019/07/07 09:29

ご回答ありがとうございます。 form内は@blockのものになります。 その場合どうすれば良いでしょうか。。。?
bamboo-nova

2019/07/07 09:49

companyではなくblockで、特にパラメータの指定などがなければ <%= form_for (@block) do |f| %> で良いと思います。
KOO_

2019/07/07 09:56

お世話になっております。 ActionView::Template::Error (First argument in form cannot contain nil or be empty): 11: </tr> 12: <%= form_for ([:mypage, @block]) do |f| %> 13: <tr> 14: <td><%= f.select(:name, [ 15: ["一般トライアルコース"], app/views/mypage/blocks/edit.html.erb:12:in `_app_views_mypage_blocks_edit_html_erb___4054124701742398534_70352037819860' その場合以下のようにエラーになってしまいます。。。
bamboo-nova

2019/07/07 10:16

@blockが生成されていないから、form_forのヘルパメソッドが動かせなくなっているようですね。 基本、form_forの引数にするオブジェクトはnilではいけないのですが、 コントローラのメソッドで、 @company = Company.find(params[:company_id])としてますね。これだと、@blockは作られていないことになるので、こちらを削除して@block = Block.find(params[:id])などとする必要があるのではないでしょうか?(:idは適当に推測して入れました) 先ほども言ったのですが、form_forで.buildをしていれば空のインスタンスを生成しているのでcreateアクションとしてコントローラに渡されてしまうので、updateアクションに渡すには単一データのインスタンスが入っている必要があります(要は、@blockが空でなく値が代入されている必要があります)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問