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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1790閲覧

Railsでレコード保存時のエラーについて教えてください。

koume

総合スコア458

Ruby

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

Ruby on Rails

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

0グッド

1クリップ

投稿2018/03/18 10:04

編集2018/03/18 11:01

Rails5.1.3でWebアプリケーション制作の勉強をしています。
2つのパターンでレコードの保存を行っていますが、一方は問題なく保存され、片方はsutoronnguパラメータでエラーが発生してしまいます。
ほとんど同じコードなのですが自力でミスを発見できないので教えていただけないでしょうか?

エラーコードの中にnil:NilClassがあるので更新した値を取得できていないのが原因だと思いますが、成功するコードと
失敗するコードのどこが悪いのか見つけることができません。

エラーの内容は以下になります。

NoMethodError in Admin::EighteensController#update private method `require' called for nil:NilClass Extracted source (around line #19): private 18 def eighteen_params 19 @params.require(:eighteen).permit(:m_1, :m_2, :m_3, :c_1, :m_4, :m_5, :m_6, :c_2, :m_7, :m_8, :m_9, :c_3, :m_10, :m_11, :m_12, :c_4, :transfer_m_1, :transfer_m_2, :transfer_m_3, :transfer_c_1, :transfer_m_4, :transfer_m_5,   :transfer_m_6, :transfer_c_2, :transfer_m_7, :transfer_m_8, :transfer_m_9, :transfer_c_3, :transfer_m_10, :transfer_m_11, :transfer_m_12, :transfer_c_4) 20 end
保存に成功するコード eighteens_controller.rb def edit @eighteen_form = Admin::EighteenForm.new(Eighteen.find(params[:id])) def update @eighteen_form = Admin::EighteenForm.new(Eighteen.find(params[:id])) @eighteen_form.assign_attributes(params[:form]) if @eighteen_form.save flash.notice = '更新しました。' if $quarter20 <= 10 redirect_to :point_acquisition_admin_record else redirect_to :bonus_acquisition_admin_record end else flash.now.alert = '入力に誤りがあります。' render action: 'edit' end       ↓ edit.html.erb <%= form_for @eighteen_form, as: 'form', url: [ :admin, @eighteen_form.eighteen ] do |f| %> <%= render 'form', f: f %> <div class="buttons"> <%= f.submit '更新' %> <%= link_to 'キャンセル', :point_acquisition_admin_record %> </div> <% end %>       ↓ _eighteen_fields.html.erb <%= markup do |m| p = confirming ? ConfirminEeighteenFormPresenter.new(ff, self) : EighteenFormPresenter.new(ff, self) p.with_options(required: true) do |q| m << q.drop_down_list_block(:transfer_m_2, '2月スコア', Eighteen::TRANSFER) end end %>       ↓ eighteen_form.rb class Admin::EighteenForm include ActiveModel::Model attr_accessor :eighteen delegate :persisted?, :save, to: :eighteen def initialize(eighteen = nil) @eighteen = eighteen @eighteen ||= Eighteen.new end def assign_attributes(params = {}) @params = params eighteen.assign_attributes(eighteen_params) end private def eighteen_params @params.require(:eighteen).permit(:m_1, :m_2, :m_3, :c_1, :m_4, :m_5, :m_6, :c_2, :m_7, :m_8, :m_9, :c_3, :m_10, :m_11, :m_12, :c_4, :transfer_m_1, :transfer_m_2, :transfer_m_3, :transfer_c_1, :transfer_m_4, :transfer_m_5, :transfer_m_6, :transfer_c_2, :transfer_m_7, :transfer_m_8, :transfer_m_9, :transfer_c_3, :transfer_m_10, :transfer_m_11, :transfer_m_12, :transfer_c_4) end end
保存に失敗するコード eighteens_controller.rb def edit @eighteen_form = Admin::EighteenForm.new(Eighteen.find(params[:id])) def update @eighteen_form = Admin::EighteenForm.new(Eighteen.find(params[:id])) @eighteen_form.assign_attributes(params[:form]) if @eighteen_form.save flash.notice = '更新しました。' if $quarter20 <= 10 redirect_to :point_acquisition_admin_record else redirect_to :bonus_acquisition_admin_record end else flash.now.alert = '入力に誤りがあります。' render action: 'edit' end       ↓ edit.html.erb <%= form_for @eighteen_form, as: 'form', url: [ :admin, @eighteen_form.eighteen ] do |f| %> <%= render 'form', f: f %> <div class="buttons"> <%= f.submit '更新' %> <%= link_to 'キャンセル', :bonus_acquisition_admin_record %> </div> <% end %>       ↓ _eighteen_quartre_fields.html.erb <%= markup do |m| p = confirming ? ConfirminEeighteenFormPresenter.new(ff,self) : EighteenFormPresenter.new(ff, self) p.with_options(required: true) do |q| m << q.drop_down_list_block(:transfer_c_1, '1クオーター', Eighteen::TRANSFER) end end %>       ↓ eighteen_form.rb class Admin::EighteenForm include ActiveModel::Model attr_accessor :eighteen delegate :persisted?, :save, to: :eighteen def initialize(eighteen = nil) @eighteen = eighteen @eighteen ||= Eighteen.new end def assign_attributes(params = {}) @params = params eighteen.assign_attributes(eighteen_params) end private def eighteen_params @params.require(:eighteen).permit(:m_1, :m_2, :m_3, :c_1, :m_4, :m_5, :m_6, :c_2, :m_7, :m_8, :m_9, :c_3, :m_10, :m_11, :m_12, :c_4, :transfer_m_1, :transfer_m_2, :transfer_m_3, :transfer_c_1, :transfer_m_4, :transfer_m_5, :transfer_m_6, :transfer_c_2, :transfer_m_7, :transfer_m_8, :transfer_m_9, :transfer_c_3, :transfer_m_10, :transfer_m_11, :transfer_m_12, :transfer_c_4) end end

どなたか教えていただけないでしょうか?宜しくお願いします。

追記
一つずづ動作確認チェックしたらeighteen_form.rb以外の表示は正常に表示できています。
保存時にえらーが出てしまうのでedit,updateアクションとeighteen_form.rbに問題があるのかと思います。

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

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

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

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

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

guest

回答1

0

ベストアンサー

`require' called for nil:NilClass

と出ているので、requireの前の@paramsがnilのためエラーになっています。
@paramsがnilになることがある場合は、fetchを使うといいです。

詳しくはこちらにあります。
4.5 Strong Parameters

そもそも@paramsがnilになる想定でない場合は、ビューからsubmitをした時にパラメータが渡ってきていないので、ビューを確認してみてください。

投稿2018/03/18 11:44

sakamoty

総合スコア40

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

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

koume

2018/03/18 14:39

回答ありがとうございます。ストロングパラメータをもう一度詳しく調べなおしたらいろいろコードミスがありました。一番の原因は:eighteenではなく :eighteen_quarterに値を入れ:eighteenを呼び出していたせいでした。 _eighteen_qusrter_fields.html.erbのコードを変更で解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問