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

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

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

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

Ruby

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

Q&A

解決済

1回答

4038閲覧

create時、ストロングパラメータがあるのにpermitted: falseが出る。

yamaoka_san

総合スコア22

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2020/02/18 14:16

visitorテーブル Visitor.create(visitor_params)がうまく行きません。

[form_for]
<%= form_for(@visitor) do |f| %>
<%= f.text_field :visitor_name, placeholder: "名前" %>
<%= f.text_field :way, placeholder: "方法" %>
<%= f.hidden_field :group_id, :value => 2 %>
<%= f.hidden_field :user_id, :value => @user_id %>
<%= f.submit "リストに加える" %>
<% end %>

[送られてくる値]

<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"gdlNN0j4V1L5jmVCDOGMZhrAa2BawnS9iSDB1qR1eh6Q2fo2iOHyhEBEpClcdZhRsjJZmO0dBZNtCX8K2WN3CA==", "visitor"=><ActionController::Parameters {"visitor_name"=>"あああ", "way"=>"あああ", "group_id"=>"2", "user_id"=>"2"} permitted: false>, "commit"=>"リストに加える", "controller"=>"visitors", "action"=>"create"} permitted: false>

[visitor_controller.rb]

def create Visitor.create(visitor_params) end

[create直下にあるストロングパラメータ]

private def visitor_params params.require(:visitor).permit(:visitor_name, :way, :group_id, :user_id).merge(user_id: @user_id) end

このストロングパラメータの何が気に入らなくてpermitted: falseなのかが分かりません。しかも2つも。全くの初歩的な質問で大変申し訳ございません。返す言葉もありません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

permitted: false だと言うのは
**[送られてくる値]**のことですか?
でしたら 送られてきた直後ですから permit されていない(未だdef visitor_paramsを通っていない)から falseです。

このプログラムで動きませんか?

投稿2020/02/18 20:40

winterboum

総合スコア23329

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

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

yamaoka_san

2020/02/18 23:32

お返事ありがとうございます。 [送られてくる値]は、params.require(:visitor).permit(:visitor_name, :way, :group_id, :user_id).merge(user_id: @user_id) の次でbiding.pryして、コンソールで「params」で取得した値です。 ストロングパラメータの中で取得しているので、ストロングパラメータの書き方がおかしいから、動いてくれないのかと。 でもこれ以外の書き方が見つからなくて困っています。
winterboum

2020/02/18 23:55

念の為にviewも載せてください。 で、 どのような動きになるのか書いていただけますか? 動きません と否定形ですと何も情報がないので考えようが無いのでs
Mugheart

2020/02/19 00:15

params.require(:visitor).permit(:visitor_name, :way, :group_id, :user_id).merge(user_id: @user_id) の部分は破壊的な変更ではないので、params の戻り値は以前の params のままです。
yamaoka_san

2020/02/19 02:18

コメントありがとうございます。色々試していて、今はuser_idをform_forから抜いています(何も変化はありませんでしたが) viewは、userモデルのviewにvisitorモデルが部分レンダーで入っている状態です。 [user/show view] <div> <%= render "visitors/new" %> </div> [visitor/new view] <%= form_for(@visitor) do |f| %> <%= f.text_field :visitor_name, placeholder: "ゲストの名前" %> <%= f.text_field :way, placeholder: "送る方法" %> <%= f.hidden_field :group_id, :value => 2 %> <%= f.hidden_field :user_id, :value => @user_id %> <%= f.submit "リストに加える" %> <% end %> [users controller] def show @visitor = Visitor.new end [visitors controller] def create p @user_id = params[:visitor][:id] Visitor.create(visitor_params) redirect_to controller: :users, action: :show, id: @user_id #=>ここまで行かない end private def visitor_params params.require(:visitor).permit(:visitor_name, :way, :group_id).merge(user_id: @user_id) #binding.pry #=>[送られてくる値]を取得した。 end
yamaoka_san

2020/02/19 02:21

ごめんなさい。 [visitors controller] (誤)@user_id = params[:visitor][:id] ↓ (正)@user_id = params[:visitor][:user_id] でした。これでもcreateできる訳じゃないのですが。。。
Mugheart

2020/02/19 02:22

visitor_params メソッドの戻り値は params.require(:visitor).permit(:visitor_name, :way, :group_id).merge(user_id: @user_id) の戻り値であり、実際にcreateアクションで使うのもこのメソッドの戻り値であって params の戻り値ではないですよね?なので visitor_params の中で params の戻り値をいくら確認したって意味のないことなんです。
maisumakun

2020/02/19 02:23

えっと、permittedがfalseになること以外に、動作に支障は出ていないのですか? (params.permitの「結果」だけpermitted:trueとなって、paramsそのものはpermitted:falseから変わらないのが正常な動作です)
yamaoka_san

2020/02/19 02:44

気にかけてくださってありがとうございます。 >>visitor_params の中で params の戻り値をいくら確認したって意味のないことなんです。 なるほど。。。binding.pryで値を取っても原因が分からないということでしょうか? >>えっと、permittedがfalseになること以外に、動作に支障は出ていないのですか? はい。submit後のレンダリングもできるようになりました。 ただcreateが出来ないだけの状態です。 >>(params.permitの「結果」だけpermitted:trueとなって、paramsそのものはpermitted:falseから変わらないのが正常な動作です) そうなんですね!もうエラーも出ないし、何が問題かがさっぱり分かりません。。。。
maisumakun

2020/02/19 02:46

.createを.create!に変えれば、作成失敗した状況を例外として投げてくれます。
Mugheart

2020/02/19 02:47

知りたいのは visitor_params の戻り値であって params の戻り値じゃないですよね? ということが言いたかったのです。params はどうやっても permitted: false ですので。
yamaoka_san

2020/02/19 03:30

>>知りたいのは visitor_params の戻り値であって params の戻り値じゃないですよね? なるほど!binding.pryをcreate直下に移動して、コンソールで「visitor_params」で値を取りました。確かにpermitted: trueになってました!でもcreateはできません。(なぜー?!) [1] pry(#<VisitorsController>)> visitor_params => <ActionController::Parameters {"visitor_name"=>"あああ", "way"=>"あああ", "group_id"=>"2", "user_id"=>"2"} permitted: true> >>.createを.create!に変えれば、 調べました。 ( https://qiita.com/metheglin/items/db595d972df99b3849c2 ) [rails save! create! update!のバリデーション例外を捕捉する] def create @person = Person.create!({ name: "Isaac Newton", age: 35 }) rescue ActiveRecord::RecordInvalid => e pp e.record.errors end というのを発見し、 Visitor.create!(visitor_params) rescue ActiveRecord::RecordInvalid => e p e.record.errors にした所、 #<ActiveModel::Errors:0x00007f9a1a71e420 @base=#<Visitor id: nil, visitor_name: "あああ", way: "あああ", group_id: 2, created_at: nil, updated_at: nil, user_id: 2>,@messages={:group=>["must exist"]}, @details={:group=>[{:error=>:blank}]}> と表示されました!カラムにgroup_idはありますが、groupはありません。が!groupモデルがあった!確かにそちらに値が入ってませんでした。 この空欄が原因でした!ここを埋めれば、無事にcreateできました! ありがとうございました!おかげで先に進めます! お手数をおかけしました!
yamaoka_san

2020/02/19 03:35

winterboum さん、Mugheart さん、そしてmaisumakun さん、どうもありがとうございました! お陰で無事にcreateできました。違うモデルが関わっているとは思いませんでした。maisumakun さんの.create!で分かりましたが、ベストアンサーにする方法が分からず、この様になっています。すいません。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問