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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

291閲覧

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

koume

総合スコア458

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/18 07:34

編集2017/10/19 08:03

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

追記

ruby

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

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

追記の追記

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

ruby

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

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

投稿2017/10/18 09:22

編集2017/10/24 02:08
chelsy7110

総合スコア596

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

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

koume

2017/10/18 11:30

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

2017/10/19 07:55

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

2017/10/24 05:40

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問