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

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

ただいまの
回答率

90.04%

Railsでのデータ更新フォームの内容を確認画面で取り込む方法について教えてください。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 499

koume

score 156

Rails5.1.3でWebアプリケーション制作の勉強中です。データを更新するコードを試しているのですがどうしても上手くいかないので
どなたか教えていただけないでしょうか? ページの表示は出来ていますがデータの取り込み方法についての質問です。

やりたいことは、編集した内容を確認画面に取り込み、そのデータを更新するということです。

現状は以下のようになっております。

1,編集ページに現在のデータは表示されています。(取り込めています。)
2,「確認画面へ進む」をクリックすると確認画面が表示されています。
3,「更新」をクリックで「アカウントを更新しました」と表示される。

動きとしては思った通りに表示出来ています。(ページの表示だけです。)

しかし、データの更新ができないのです。問題は編集ページで更新した内容が確認画面に反映させず、確認画面にも初期データが
表示されているので更新できないのでは?と思っています。編集した内容を確認画面で取り込む(表示させる)→ 更新する には
どうしたらいいかわかりませんのでどなたか教えていただけないでしょうか?

・編集ページの表示は edit アクション
・確認画面ページの表示は confirm アクション
・更新は update アクション
コードは以下になります。

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>
confirm.html.erb

<% @title = '口座アカウントの更新(確認)' %>
<h1><%= @title %></h1>

<div id="generic-form">
  <%= form_for @bank_form, as: 'form', url: :customer_bank do |f| %>
    <p>以下の内容で口座アカウントを更新します。よろしいですか?</p>
    <%= render 'confirming_form', f: f %>
    <div class="buttons">
      <%= f.submit '更新' %>
      <%= f.submit '訂正', name: 'correct' %>
    </div>
  <% end %>
</div>
_confirming_form.html.erb

<fieldset id="bank-fields">
  <legend>口座アカウント更新内容</legend>
  <%= render 'bank_fields', f: f, confirming: true %>
</fieldset>
_form.html.erb

<%= FormPresenter.new(f, self).notes %>
<fieldset id="Bank-fields">
  <legend>口座情報(正確に入力してください。)</legend>
  <%= render 'bank_fields', f: f, confirming: false %>
</fieldset>
confirming_bank_form_presenter.rb

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


以上ですが、confirming_bank_form_presenter.rb の m.div(object.send(name), class: 'field-value') のコードで確認画面にデータが表示されているのですが、編集した内容ではなく初期データが表示されてしまいます。どう記述すれば「編集」画面の内容を表示できるのでしょうか?
どなたか教えてください。宜しくお願いします。

追記

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


追記

_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 %>


追記

edit.html.erbが表示されたときの出力

Started PATCH "/mypage/bank" for 10.0.2.2 at 2017-10-18 12:23:34 +0000
Processing by Customer::BanksController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"1chV0w0pxy53uFHxymlrUDzu1aIlq
ZXWPIvFui2YXpqKCfbAUqls2Yob43UadjW4nw7tfWWIupT+5v/+BCNv4Q==", "form"=>{"bank"=>{ 
"bk_name"=>"xyz銀行", "office"=>"いろは支店", "account"=>"1234567", "acc_name"=> 
"佐藤一郎", "acc_name_kana"=>"サトウイチロウ"}}, "correct"=>"訂正", "host"=>"exa                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 mple.com"}


confirm.html.erbの表示されたときの出力

Started PATCH "/mypage/bank/confirm" for 10.0.2.2 at 2017-10-18 12:23:52 +0000
Processing by Customer::BanksController#confirm as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"hiE+QpQjqQQexMF03G2OxsTuf17oA
dwxcT8npHiH3HPZ4J1Ry6MC8+Nnc/AMctAuZw5Hgagg83OzUh3gUTztCA==", "form"=>{"bank"=>{
"bk_name"=>"xyz銀行fd", "office"=>"いろは支店", "account"=>"1234567", "acc_name"                                                                                                                                                                                                                                                                                                                           
=>"佐藤一郎", "acc_name_kana"=>"サトウイチロウ"}}, "commit"=>"確認画面へ進む", " 
host"=>"example.com"}                                                                                                                                                                                                                                                                                                                        


bk_nameを編集した時の出力です。これを見る限りデータは送られてきているのかな?って思いますが表示は編集前の値です。

追記

def confirm
  @bank_form = Customer::BankForm.new(Bank.find_by(customer_id: current_customer.id))
   @bank_form.assign_attributes(params[:form][:bank][:bk_name])
   @bank_form.assign_attributes(params[:form][:bank][:office])
   @bank_form.assign_attributes(params[:form][:bank][:account])
   @bank_form.assign_attributes(params[:form][:bank][:acc_name])
   @bank_form.assign_attributes(params[:form][:bank][:acc_name_kana])
    if @bank_form.valid?
      render action: 'confirm'
    else
      flash.now.alert = '入力に誤りがあります。'
      render action: 'edit'
    end
  end

  def create
  end

  def update
    @bank_form = Customer::BankForm.new(Bank.find_by(customer_id: current_customer.id))
    @bank_form.assign_attributes(params[:form][:bank][:bk_name])
    @bank_form.assign_attributes(params[:form][:bank][:office])
    @bank_form.assign_attributes(params[:form][:bank][:account])
    @bank_form.assign_attributes(params[:form][:bank][:acc_name])
    @bank_form.assign_attributes(params[:form][:bank][:acc_name_kana])
    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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

confirm画面で初期のデータが表示されているということであれば、bank_paramsに入力した値が入っていないのでは無いでしょうか。
ログを見たりしてformから正常なparamsが送られているか確認してみてください。
presenterによって生成されたhtmlがおかしいような気がします。

_bank_fields.html.erbがないので、前の質問を確認しました。
追記しておいたほうが回答がしやすくなると思います。

 追記
Parameters: {"utf8"=>"✓", "authenticity_token"=>"1chV0w0pxy53uFHxymlrUDzu1aIlq
ZXWPIvFui2YXpqKCfbAUqls2Yob43UadjW4nw7tfWWIupT+5v/+BCNv4Q==", "form"=>{"bank"=>{ 
"bk_name"=>"xyz銀行", "office"=>"いろは支店", "account"=>"1234567", "acc_name"=> 
"佐藤一郎", "acc_name_kana"=>"サトウイチロウ"}}, "correct"=>"訂正", "host"=>"exa


出力のこの部分がparamsとしてcontrollerに送られている部分です。
ここでparams[:form][:bank][:bk_name]と書くことで"xyz銀行"が取得出来ます。
前の質問でBankFormを確認しましたが、assign_attributes@params = paramsとやっているだけですので、更新するというコードが無いですね。
それが原因だと思います。

 追記の追記

返事が遅くなり申し訳ありません。
BankFormのassign_attributesですが、中の@bankを更新するのですから

def assign_attributes(params = {})
  @bank.assign_attributes(params)
end


こんな感じにして、BankFormのassign_attributesを呼び出した場合は間接的に@bank.assign_attributesを呼び出しているという風にしてやればいいのではないでしょうか。
(paramsがどういう状況で送られてくるかによって記述は変わると思います)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/18 20:30

    回答ありがとうございます。bank_paramsの所をparams[:form]に変えてみましたが同じ結果でした。ログは見たことがないのですがlogger.debug("[debug] bank#confirm")をコードに追記してlogフォルダで表示しようとしたところファイルサイズ16MGと大きすぎて表示出来ませんでした。

    キャンセル

  • 2017/10/19 16:55

    回答ありがとうございます。なんとなく理解出来ましたが bank_form.rb の
    assign_attributesに更新するというコードをどう書けばいいのか手も足も出ません。コントローラ側はいいのかどうかわかりませんが記述してみました。
    office,account,acc_name,acc_name_kanaを取得するにはこのように記述すればいいのでしょうか?お手数をかけますが、assign_attributesの更新の記述方法と値の取得について教えていただけないでしょうか?宜しくお願いします。コントローラの記述は追記しておきます。本当に行き詰まっていますのでchelsy7110さんだけが頼りです。助けてください。

    キャンセル

  • 2017/10/24 14:40

    回答ありがとうございます。
    手も足も出ない状況でしたので感謝しております。
    参考にしていろいろ試してみます。
    今後とも宜しくお願いします。

    キャンセル

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

  • ただいまの回答率 90.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる