Rails5.1.3でWebアプリケーション制作の勉強中です。参考書を見ながら、コードを少し変更したりして学習しております。
その中で、画面の表示関連のところで、思ったように表示してくれないのでここ3日ほど悩んでおります。
いろいろ調べているうちに m.div(object.send(name), class: 'field-value') のコードのところで思うように
表示してくれないようでした。一連のコードは以下になります。
class ConfirmingBankFormPresenter < ConfirmingFormPresenter def bk_name_block(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 def office_block(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 def account_block(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 def acc_name_block(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 def acc_name_kana_block(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
各メソッドに同じコードを記述していますが 参考書の内容をそのまま記述していて m.div(object.send(name), class: 'field-value') のコードの意味が読み取れない(意味がわからない)のでどなたか意味を教えていただけないでしょうか?
追記: 表示したい画面の内容とコードです。
編集画面が表示されていて、この画面で編集します。
この画面を表示するコードは以下になります。
edit.html.erbのコードです。 <% @title = '口座アカウントの編集' %> <h1><%= @title %></h1> <div id="generic-form"> <%= form_for @bank_form, as: 'form', url: :confirm_customer_bank do |f| %> #confirmアクションへ <%= render 'form', f: f %> <div class="buttons"> <%= f.submit '確認画面へ進む' %> <%= link_to 'キャンセル', :customer_root %> </div> <% end %> </div>
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
次に確認画面へ進む をクリックし確認画面に進みます。
confirm.html.erb <% @title = '口座アカウントの更新(確認)' %> <h1><%= @title %></h1> <div id="generic-form"> <%= form_for @bank_form, as: 'form', url: :customer_bank do |f| %> # updateアクションへ <p>以下の内容で口座アカウントを更新します。よろしいですか?</p> <%= render 'confirming_form', f: f %> <div class="buttons"> <%= f.submit '更新' %> <%= f.submit '訂正', name: 'correct' %> </div> <% end %> </div>
質問したコードは確認画面の内容を表示するコードです。(上記画面の内容を表示するコード)
コントローラのコードは以下になります。
class Customer::BanksController < Customer::Base def show @bank = current_customer @bank = Bank.find_by(customer_id: current_customer.id) end def new @bank_form = Customer::BankForm.new end def edit @bank_form = current_customer end # PATCH def confirm @bank_form = 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 create end def update @bank_form = current_customer @bank_form.assign_attributes(bank_params) 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
ここでハマってしまいました。 m.div(object.send(name), class: 'field-value') の部分で入力部分の表示を
しているようなのですが、編集した内容を確認画面でそのまま表示したいのに、編集内容が反映されず編集前の内容が表示されてしまいます。
内容を編集し[確認画面へ進む]をクリックしたときのコンソール出力は以下になっています。
Started PATCH "/mypage/bank/confirm" for 10.0.2.2 at 2017-09-19 23:44:54 +0000 Processing by Customer::BanksController#confirm as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"hlHOVUkOea6sdbVpupNfYxiFV81cQFoKbsxbs09zv+wXPcOxLxgj+MdD4qwUHJ24cM5v+53yq0gsuhS4Rh+8Yw==", "form"=>{"bank"=>{"bk_name"=>"ABC銀行", "office"=>"いろは支店", "account"=>"1234567", "acc_name"=>"佐々木一郎", "acc_name_kana"=>"サトウイチロウ"}}, "commit"=>"確認画面へ進む", "host"=>"example.com"} Customer Load (0.9ms) SELECT `customers`.* FROM `customers` WHERE `customers`.`id` = 1 LIMIT 1 Unpermitted parameters: :utf8, :_method, :authenticity_token, :form, :commit, :host Customer Exists (0.7ms) SELECT 1 AS one FROM `customers` WHERE `customers`.`email_for_index` = BINARY 'sato.ichiro@example.jp' AND (`customers`.`id` != 1) LIMIT 1 Rendering customer/banks/confirm.html.erb within layouts/customer Bank Load (0.5ms) SELECT `banks`.* FROM `banks` WHERE `banks`.`customer_id` = 1 LIMIT 1 Rendered customer/banks/_bank_fields.html.erb (162.4ms) Rendered customer/banks/_confirming_form.html.erb (166.0ms) Rendered customer/banks/confirm.html.erb within layouts/customer (169.2ms) Rendered customer/shared/_header.html.erb (1.5ms) Rendered shared/_footer.html.erb (0.4ms) Completed 200 OK in 520ms (Views: 485.2ms | ActiveRecord: 2.1ms)
*口座名を佐藤一郎から佐々木一郎へ変更してから確認画面へ進んでも表示は佐藤一郎のままなのです。
編集した内容が反映されず編集前の内容が表示されてしまうのでどう記述すれば反映されるのかわからなくて困っています。
お手数をおかけしますが教えていただけないでしょうか?お願いします。
追記: 画面を切り換え時の表示コードも追記させていただきます。
_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 %>
BankFormPresenter.new(ff, self) が最初の画面用です。
ConfirmingBankFormPresenter.new(ff, self)が確認画面用です。
なので1行目の<%= f.fields_for :bank, f.object.bank do |ff| %>が原因で表示内容がおかしいのかな?とも考えています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/19 23:54