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

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

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

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

Q&A

解決済

1回答

532閲覧

railsでviewとcontrollerのデータの受け渡しについて

marimo0

総合スコア5

Ruby on Rails

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

0グッド

0クリップ

投稿2020/12/10 13:27

前提・実現したいこと

rails(5.2.4)でwebアプリを作っているのですが、viewとControllerでの
データ受け渡しがうまくいかずに悩んでいます。

具体的には、
sections/new.html.erb 読み込み時に
下記 sections_controller.rbで10レコードのデータベースを作成

###sections_controller.rb
def new
for i in 1..10 do
@section = Section.new
@section.user_id = current_user.id
@section.section_id = i
@section.complete = false
@section.save


あわせて sections/new.html.erb 上では下記コードで1~10まで番号の振られたボタン10個のボタンを生成してを押すと、それぞれの番号に対応したsection_idのレコードのcompleteカラム
にtrueが入るようにしたいです。

###new.html.erb

<%= for i in 1..10 do %>
<%= form_for(@section,url:{controller:"sections",action:"update"}) do |f| %>
<%= f.hidden_field :section_id, value: i %>

<%= f.submit i, class: "button is-success" %> <% end %> <% end %>

上記Viewで呼んでいるcontrollerのアクションは下記の通りです。

###sections_controller.rb
def update
@section = Section.find_by(section_id: params[:section_id], user_id: current_user.id, complete:false )
logger.debug(@section)

@section.complete = true @section.save

end


解決方法ご存知の方いましたら、ご教授よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

def new の@sectionの値が
for i in 1..10 doで作成した最後の値(10個目)のみになっています。

以下のようにすると@sectionsに10個のsectionが入ります。

ruby

1@sections = 10.times.map do |i| 2 section = Section.new 3 section.user_id = current_user.id 4 # i が 0 から始まるので + 1 5 section.section_id = i + 1 6 section.complete = false 7 section.save 8 section 9end

あとはビューでループしてフォームを作成します

erb

1<% @sections.each do |section| %> 2 <%= form_for(section, url:{controller:"sections",action:"update"}) do |f| %> 3...

フォームの作成で url: { controller:"sections", action:"update" } としていますが、
id を指定していないのでエラーになるかもしれません。def update も修正が必要に見えます。

どういったものを作りたいのかはっきり分からないのであれですが、
そもそも、new でsectionを作成する必要があるのか疑問です。
ユーザーがnewでリーロードするたびに10個のsectionが作られてしまいます。

たとえば、newアクションでは何もせず、
view で以下のようにすれば押したボタンのセクションだけ作成できるはずです。

erb

1<% 10.times do |i| %> 2 <%= form_with(model: Section.new) do |f| %> 3 <% f.hidden_field :section_id, value: i + 1 %> 4 <%= f.submit i, class: "button is-success" %> 5 <% end %> 6<% end %>

投稿2020/12/11 01:48

neko_daisuki

総合スコア2090

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

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

marimo0

2020/12/12 07:51

ご回答ありがとうございます。 ページリロード毎に10セクションが作成されていたのは改善したいと考えていたので、下の方で頂いたコードを参考に、viewで押したボタンごとのセクション作成できるようになりました。 同じページに同様のupdate 用ボタンを作成して、作成したセクションの値をボタン押下で更新(completeの値をtrueに)したいと考えて、教えて頂いたform_withでupdateアクションを指定してみたのですが、うまくいかず…ロジックとしては登録されたセクションから同じuse_id、section_idを指定して更新すればいいと思うのですが‥ もしそのような機能の、viewとアクションの書き方ご存知でしたら教えていただけるとありがたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問