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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1593閲覧

Railsのファイル読み込み時のエラーについて教えてください。

koume

総合スコア458

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/18 01:52

編集2017/10/18 02:32

Rails5.1.3でWebアプリケーション制作の勉強中です。口座のアカウントの更新ページを作ってみようと動作確認しているのですが、エラーが出てしまい自力で解決出来ずに困っております。やろうとしていることは以下になります。

1,「編集」をクリックするとログイン中のユーザーのレコードを表示する。(Banksテーブルのレコードを表示する。)
・editアクションでbank_form.rbを@bank_formに代入する。 *ここでエラーが出ます。
・部分テンプレート_form.html.erbを読み込みさらに_bank_fields.html.erbでBank_Form_Presenterを読み込み登録済みの内容を表示する。

2,編集画面に変更内容を記述する。
・変更したい内容を記述する。

3,「確認画面へ進む」をクリックし更新画面で編集内容を確認する。
・confirmアクションでbank_form.rbを@bank_formに代入する。 *たぶんここでもエラーが出ます。
・部分テンプレート_confirming_form.html.erbを読み込みさらに_bank_fields.html.erbでConfirming_Bank_Form_Presenter.rbを読み込み編集した内容を表示する。

4,「更新」をクリックし更新する。(Banksテーブルに保存する。)
・updateアクションで保存。

このような流れで更新したくて記述しましたが bank_form.rbのコードが上手く機能してくれません。(エラーが出てしまいます。)
bk_nameというメソッドが定義されていないというエラーがでてしまいますが、解決策がわからなくて困っております。
コードは 以下になります。

banks_controller.rb def edit @bank_form = Customer::BankForm.new(current_customer) end # PATCH def confirm @bank_form = Customer::BankForm.new(current_customer) @bank_form.assign_attributes(bank_params) if @bank_form.valid? render action: 'confirm' else flash.now.alert = '入力に誤りがあります。' render action: 'edit' end end def update @bank_form = Customer::BankForm.new(current_customer) @bank_form.assign_attributes(bank_params) if params[:commit] if @bank_form.save flash.notice = '口座アカウントを更新しました。' redirect_to :customer_root else flash.now.alert = '入力に誤りがあります。' render action: 'edit' end else render action: 'edit' end end private def bank_params params.permit(bank: [:bk_name, :office, :account, :acc_name, :acc_name_kana]) end end
bank_form.rb 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 end private def bank_params @params.permit(bank: [:bk_name, :office, :account, :acc_name, :acc_name_kana]) end end
edit.html.erb <% @title = '口座アカウントの編集' %> <h1><%= @title %></h1> <div id="generic-form"> <%= form_for @bank_form, as: 'form', url: :confirm_customer_bank do |f| %> <%= render 'form', f: f %> <div class="buttons"> <%= f.submit '確認画面へ進む' %> <%= link_to 'キャンセル', :customer_root %> </div> <% end %> </div>
_bank_fields.html.erb <%= f.fields_for :bank, f.object.bank do |ff| %> <%= markup do |m| p = confirming ? ConfirmingBankFormPresenter.new(ff, self) : BankFormPresenter.new(ff, self) p.with_options(required: true) do |q| m << q.bk_name_block(:bk_name, '銀行名') m << q.office_block(:office, '支店名') m << q.account_block(:account, '口座番号') m << q.acc_name_block(:acc_name, '口座名義') m << q.acc_name_kana_block(:acc_name_kana, '口座名義(フリガナ)') end end %> <% end %>
Bank_Form_Presenter.rb class BankFormPresenter < FormPresenter def bk_name_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) m << error_messages_for(name) end end def office_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) m << error_messages_for(name) end end def account_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) m.span ' (普通預金口座番号のみ)', class: 'notes' m << error_messages_for(name) end end def acc_name_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) m.span ' (本人名以外は無効です。)', class: 'notes' m << error_messages_for(name) end end def acc_name_kana_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) m.span ' (カタカナで入力してください。)', class: 'notes' m << error_messages_for(name) end end end

「編集」をクリックして時に出るエラーは以下になります。

NoMethodError in Customer::Banks#edit Showing /home/vagrant/chibi/chibi/app/views/customer/banks/_bank_fields.html.erb where line #8 raised: undefined method `bk_name' for #<Customer:0x007f5adc339490> Extracted source (around line #5): 4 attr_reader :form_builder, :view_context 5 delegate :label, :text_field, :password_field, :check_box, :radio_button, :text_area, :bk_name, :object, to: :form_builder 6 7 def initialize(form_builder, view_context) 8 @form_builder = form_builder

コンソールには以下のように表示されます。

ActionView::Template::Error (undefined method `bk_name' for #<Customer:0x007f5ad c339490>): 7: p.with_options(required: true) do |q| 8: m << q.bk_name_block(:bk_name, '銀行名') 9: m << q.office_block(:office, '支店名') 10: m << q.account_block(:account, '口座番号') 11: m << q.acc_name_block(:acc_name, '口座名義')

コントローラの@bank_form = Customer::BankForm.new(current_customer)の部分を
@bank_form = current_customer にすると_bank_fields.html.erbを読み込んでくれて3つのアクションは機能して
表示だけはされますが更新してくれません。bank_form.rbに問題があると思うのですが自力ではどうしようもないのでどなたか教えていただけないでしょうか?宜しくお願いします。

bank_form.rbでbk_nameを定義すれば解決できるのかな?とは思いますが、だとしても定義の仕方がわからないのです。
初心者なので長々と内容を全て記述させていただきました。お忙しいとは思いますが教えてください。お願いします。

追記

form_presenter.rb class FormPresenter include HtmlBuilder attr_reader :form_builder, :view_context delegate :label, :text_field, :password_field, :check_box, :radio_button, :text_area, :bk_name, :object, to: :form_builder def initialize(form_builder, view_context) @form_builder = form_builder @view_context = view_context end def notes markup(:div, class: 'notes') do |m| m.span '*', class: 'mark' m.text '印の付いた項目は入力必須です。' end end def text_field_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) if options[:maxlength] m.span "(#{options[:maxlength]}文字以内)", class: 'instruction' end m << error_messages_for(name) end end def number_field_block(name, label_text, options = {}) markup(:div) do |m| m << decorated_label(name, label_text, options) m << form_builder.number_field(name, options) if options[:max] max = view_context.number_with_delimiter(options[:max].to_i) m.span "(最大値: #{max})", class: 'instruction' end m << error_messages_for(name) end end def password_field_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << password_field(name, options) m << error_messages_for(name) end end def nickname_field_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) #m.span ' (半角英数字で入力してください。)', class: 'notes' m << error_messages_for(name) end end def sponsor1_field_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << text_field(name, options) m.span ' (紹介者不在の場合はそのまま。)', class: 'notes' m << error_messages_for(name) end end def date_field_block(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) if options[:class].kind_of?(String) classes = options[:class].strip.split + [ 'datepicker' ] options[:class] = classes.uniq.join(' ') else options[:class] = 'datepicker' end m << text_field(name, options) m << error_messages_for(name) end end def drop_down_list_block(name, label_text, choices, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m << form_builder.select(name, choices, { include_blank: true }, options) m << error_messages_for(name) end end def error_messages_for(name) markup do |m| object.errors.full_messages_for(name).each do |message| m.div(class: 'error-message') do |m| m.text message end end end end def decorated_label(name, label_text, options = {}) label(name, label_text, class: options[:required] ? 'required' : nil) end def bk_name(name, label_text, options = {}) markup(:div, class: 'input-block') do |m| m << decorated_label(name, label_text, options) m.div(object.send(name), class: 'field-value') m << hidden_field(name, options) end end end

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

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

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

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

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

guest

回答1

0

自己解決

situmonnno内容を変えさせていただきます。

投稿2017/10/18 06:52

koume

総合スコア458

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問