🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails 5

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

Ruby

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

Q&A

解決済

3回答

3947閲覧

【Rails】hidden_fieldで受け渡したはずのparams[:parent_id]の値がnilになるのを解決したい

osen_eng

総合スコア14

Ruby on Rails 5

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

Ruby

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

0グッド

1クリップ

投稿2019/10/26 07:09

編集2019/10/26 08:29

前提・実現したいこと

SNSを作っています。投稿にリプライをつける機能を実装したいのですが、paramsの値がnilになってしまいます。

該当のソースコード

<%= form_with url: '/posts' , local: true do |f| %> <% f.hidden_field :parent_id, { value: @post.id} %> <div class ="form-group"> <%= f.text_area :content, class: "form-control", placeholder: "返信を入力(140文字以内)" %> </div> <div class ="text-center"> <%= f.submit "送信する", class: "btn btn-primary" %> </div> <% end %>

これがフォームのHTMLです。

def create if params[:parent_id] @post = Post.new(content: reply_params[:content], user_id: @current_user.id, parent_id: params[:parent_id]) if @post.save redirect_to post_path(params[:parent_id]), notice: '送信しました' else flash[:alert] ='送信に失敗しました' render post_path(params[:parent_id]) end else @post = Post.new(content: post_params[:content], user_id: @current_user.id) if @post.save redirect_to root_path, notice: '送信しました' else flash[:alert] = '送信に失敗しました' render :new end end end

これがコントローラーのcreateメソッドです。

フォームの中でhidden_fieldで受け渡したparent_idをcreateメソッド内で使いたいのですが、params[:parent_id]の値がnilになってしまいます。
params[:content]などの、フォームに入力したあたいはうまく受け取れています。

params[:parent_id]を受け取るにはどうすればいいのでしょうか。

フォームはshowアクションのviewに書いていて、そこからcreateアクションを呼び出そうとしているためにこのような不具合が起きているのかもしれないと思っています。

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

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

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

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

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

winterboum

2019/10/26 09:14

controlllerの def new を見せて下さい
osen_eng

2019/10/26 09:28

情報不足で申し訳ございません。 def new @post = Post.new end です。
guest

回答3

0

<% f.hidden_field :parent_id, @post.id %>
でどうでしょう。
あと、newにて
@post = Post.new(parent_id: ペアレントのID)
で@postをつくっておけば
<% f.hidden_field :parent_id %>
で済みます。form_with @post だったっけ、、、
#####
def new
@post = Post.new
end
ですと、
<% f.hidden_field :parent_id, @post.id %>
の @post.id は nil になりますよ

投稿2019/10/26 09:23

編集2019/10/26 09:32
winterboum

総合スコア23567

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

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

osen_eng

2019/10/26 09:43

showの中に作ったフォームに値を入力して、送信ボタンを押した後にcreateで処理をしたいと考えているのですが、それでもnewに何か記述する必要がありますか? showの中では def show @post = Post.find(params[:id]) end にしてあり、@post.idはnilにならないようにしてあります。
winterboum

2019/10/26 09:48

newでなくshowからcreateですか、、、、 <% f.hidden_field :parent_id, @post.id %> ではどうなります?
osen_eng

2019/10/26 09:55

<% f.hidden_field :parent_id, @post.id %> に変更してみると、 NoMethodError in Posts#show undefined method `merge' for 1:Integer というエラーがでて、showすら開けませんでした。
winterboum

2019/10/26 10:05

ではもとに戻していただいて、 submitした時のlogを見せていただけますか
osen_eng

2019/10/26 10:33

すいません、経験が浅くlogというのを使うのが初めてで戸惑ってしまいました。 返信を入力してからsubmitするまでに、development.logファイルに書き加えられた内容をコピペして張ったのですが、これで合ってますか? 違ったら送りなおしますので教えていただけるとありがたいです。
winterboum

2019/10/26 10:45

合ってます。 で、parameterに parent_idがありません。 これは 値が nil の時に起きます。 さて、、、、 <%= f.text_field :parent_id, :value => @post.id %> で値があることを確認出来ますか?
osen_eng

2019/10/26 11:11

<%= f.text_field :parent_id, :value => @post.id %>全体に値があることの確認はやりかたが分からないのですが、コード内にbyebugと記入してrails cで確認したところ、 (byebug) @post.id 9 となったので、@post.idには確かに値があるはずです。
guest

0

自己解決

初歩的なミスでした。<% hidden_field…を、<%= hidden_field… に変えたら解決しました。
回答をくださったお二方、ありがとうございました。

投稿2019/10/26 16:52

osen_eng

総合スコア14

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

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

0

<% f.hidden_field :parent_id, { value: @post.id} %>

<%= f.hidden_field :parent_id, :value => @post.id %>
こうするとparams[:parent_id]でとれるかと思います。

投稿2019/10/26 07:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

osen_eng

2019/10/26 08:21

修正したのですが、nilのままでした
退会済みユーザー

退会済みユーザー

2019/10/26 08:25

view上で <%= @post.id %> としたときに値は入っていますか? もし入っているのなら申し訳ないのですが、私では原因がわかりかねます。
osen_eng

2019/10/26 08:46

byebugを使って確認したのですが、viewの時点では@post.idに値は入っていました。 しかし、createアクションに移るとnilになってしまうのです。 貴重なお時間を割いていただきありがとうございました。もう少し考えてみます。
winterboum

2019/10/26 09:16 編集

引数の最後にくるHashは {} の省略が許されるので , { value: @post.id} , { :value => @poste.id} , :value => @post.id , value: @post.id はみな同じ意味です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問