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

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

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

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

Ruby on Rails

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

Q&A

解決済

3回答

4495閲覧

Railsのエラーの内容がわからないので教えてください。

koume

総合スコア458

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/12/03 16:10

編集2017/12/04 04:48

Rails5.1.3でWebアプリケーション制作の勉強をしています。エラーの内容がわからないので教えていただけないでしょうか?

エラーの内容 NoMethodError in Customer::BanksController#create private method `require' called for {:customer_id=>92}:Hash Extracted source (around line #20): 18  private 19  def bank_params 20  @params.require(:bank).permit(:bk_name, :office, :account, :acc_name, :acc_name_kana) 21  end 22 end Rails.root: /home/vagrant/chibi/chibi Application Trace | Framework Trace | Full Trace app/forms/customer/bank_form.rb:20:in `bank_params' app/forms/customer/bank_form.rb:15:in `assign_attributes' app/controllers/customer/banks_controller.rb:44:in `create'

NoMethodError in Customer::BanksController#create
private method `require' called for {:customer_id=>92}:Hash
質問が重複してしまっているのですがこのエラーはどういうことを言っているのでしょうか?

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

追記
このように記述しています。

class Customer::BankForm include ActiveModel::Model attr_accessor :bank delegate :persisted?, :valid?, :save, to: :bank def initialize(bank = nil) @bank = bank @bank ||= Bank.new @customer.build_bank unless @bank end def assign_attributes(params = {}) @params = params bank.assign_attributes(bank_params) end private def bank_params @params.require(:bank).permit(:customer_id, :bk_name, :office, :account, :acc_name, :acc_name_kana) end end

@paramsの部分をparamsに変えて実行すると下記エラーに変わります。

NameError (undefined local variable or method `params' for #<Customer::BankForm: 0x007ff8438dc258> Did you mean? @params): app/forms/customer/bank_form.rb:20:in `bank_params' app/forms/customer/bank_form.rb:15:in `assign_attributes' app/controllers/customer/banks_controller.rb:44:in `create'

何が原因なのかがわからないので教えていただけないでしょうか?

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

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

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

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

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

guest

回答3

0

ベストアンサー

ここで意図した require(:bank) は,リクエストパラメーターから bank[ ] の形の値の塊を取り出すための,Rails で定義されたメソッドですね。

このメソッドは ActionController::Parameters というクラスのオブジェクトに対して使えます。

http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-require

ところがエラーメッセージは

NoMethodError in Customer::BanksController#create
private method `require' called for {:customer_id=>92}:Hash

となっていますから,{:customer_id=>92} という Hash オブジェクトに対して require が呼ばれていることが分かります。

@params というインスタンス変数はハッシュを格納しているのですね。

おそらく params の書き間違いでしょう。

params は,ActionController::Parameters のインスタンスを返すメソッドです。

さて,もう一度エラーメッセージを見ると,

require なんてメソッド知るかよ

ではなく

プライベートメソッド require を呼んでるじゃねーか

と言っています。

これはどういうことでしょうか

Ruby の処理系は,ハッシュに対して require しようとしたのを,「ははーん,Kernel#require だな」と解釈したわけです。

ライブラリーを読み込むときによく使うアレですね。

Kernel というモジュールは Object クラスに include されているので,Kernel のインスタンスメソッドは基本的にどんなオブジェクトからも見えます。

だからそういう解釈になるわけです。

ところが,Kernel#require はプライベートメソッドとして定義されています。

プライベートメソッドは レシーバーをあらわに書いて呼び出すことができないメソッド のことです。

つまり,

rb

1hoge.require

の形で使うことは許されないのですね。

これがエラーメッセージの言わんとするところです。

投稿2017/12/03 23:42

編集2017/12/04 11:20
scivola

総合スコア2108

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

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

koume

2017/12/04 04:49

回答ありがとうございます。@paramsのところをparamsに変えたら別のエラーが出てしまいました。 詳細を追記しましたので、教えていただけないでしょうか?お願いします。
guest

0

だとすると,bank_params メソッド内で使うのはやはり @params なんでしょうね。

で,@params の値をセットしているのは assign_attributes メソッドです。このメソッドを呼び出すときに適切な引数(ActionController::Parameters のインスタンス)が与えられていない,ということではないでしょうか。
んー,それにしても引数のデフォルトが {} というのは腑に落ちないですね。これだと同じエラーが出てしまう。

投稿2017/12/04 11:18

scivola

総合スコア2108

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

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

0

params はモデルオブジェクトでは使えません。
なので BankForm 内に出てくるのはちょっと設計がおかしいのではないかという気がします。
コントローラーでやるべきことをモデルに書いちゃっていませんか?

投稿2017/12/04 06:05

scivola

総合スコア2108

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

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

koume

2017/12/04 08:14

回答ありがとうございます。初心者なので参考書を参考にして作っていますが参考書ではBankFormに記述しているんです。数日悩んでいますが、もう一度詳しく調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問