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

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

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

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1686閲覧

Rails: edit/updateでデフォルトで値がセットされない

innjera

総合スコア132

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/07/05 14:06

編集2017/07/06 04:44

Ruby on Rails 5.0.0.1で開発しています。

Lessonmodelに関し、登録済みのデータをedit / updateする際に、もともと登録されていた値がデフォルトでセットされず、初期(new/create)の時と同じ状態に戻ってしまいます。

options_from_collection_for_selectを利用しているpriceの部分のみこの現象が起きているので、ここに原因があるのだと思いますが、直し方がわからず、ご教示頂けますと幸甚です。

以下写真の様に、4,000円で登録しているのに、editに行くと
イメージ説明

この様にデフォルトで4,000円が入らず、新規作成と同様の状態に戻ってしまう
イメージ説明

ruby

1###Lesson model 2class Lesson < ApplicationRecord 3 4 validates :title, presence: true, length: {maximum: 50} 5 validates :price, :required_time, :makeupkit, :place, presence: true 6 validates :place_memo, presence: true, length: {maximum: 100} 7 validates :memo, presence: true, length: {maximum: 1000} 8 9 PRICE_LIST = { 10 "無料" => 0, "1,000円" => 1000, "1,500円" => 1500, "2,000円" => 2000, 11 "2,500円" => 2500, "3,000円" => 3000, "3,500円" => 3500, "4,000円" => 4000, 12 "4,500円" => 4500, "5,000円" => 5000, "6,000円" => 6000, "7,000円" =>7000, 13 "8,000円" => 8000, "9,000円" => 9000, "10,000円" => 10000, "11,000円" => 11000, 14 "12,000円" => 12000, "13,000円" => 13000, "14,000円" => 14000, 15 "15,000円" => 15000, "16,000円" => 16000, "17,000円" => 17000, "18,000円" => 18000, 16 "19,000円" => 19000, "20,000円" => 20000 17 } 18 19 PREFECTURE_NAMES = %w( 20 その他(コメント欄に記入) 21 北海道 22 青森県 岩手県 宮城県 秋田県 山形県 福島県 23 茨城県 栃木県 群馬県 埼玉県 千葉県 東京都 神奈川県 24 新潟県 富山県 石川県 福井県 山梨県 長野県 岐阜県 静岡県 愛知県 25 三重県 滋賀県 京都府 大阪府 兵庫県 奈良県 和歌山県 26 鳥取県 島根県 岡山県 広島県 山口県 27 徳島県 香川県 愛媛県 高知県 28 福岡県 佐賀県 長崎県 熊本県 大分県 宮崎県 鹿児島県 29 沖縄県 30 ) 31 32end

ruby

1###_form.html.erb(newでもeditでも共通で利用) 2 <%= f.label :title, "レッスン名", class: "required" %> 3 <%= f.text_field :title, class:"form-control", placeholder:"例:目元が映えるメイク" %> 4 <%= f.label :price, "価格(¥)", class: "required" %> 5 <%= f.select :price, options_from_collection_for_select(Lesson::PRICE_LIST, :last, :first), {}, {class:"form-control"}%> 6 <%= f.label :place, "場所(都道府県)", class: "required"%> 7 <%= f.select :place, Lesson::PREFECTURE_NAMES, {}, {class:"form-control"} %>

ruby

1###controller 2class User::LessonsController < User::Base 3 4 def edit 5 @lesson = current_user.adviser.lessons.find(params[:id]) 6 t = 3 - @lesson.lesson_images.size.to_i 7 t.times{@lesson.lesson_images.build} 8 end 9 10 def update 11 @lesson = current_user.adviser.lessons.find(params[:id]) 12 @lesson.assign_attributes(lesson_params) 13 if @lesson.save 14 redirect_to [current_user, :user_lesson], notice: "レッスン内容をupdateしました。" 15 else 16 flash.now.alert = '入力に誤りがあります。入力必須項目を確認して下さい。' 17 render "edit" 18 end 19 end 20 21 private def lesson_params 22 attrs = [ 23 :id, 24 :adviser_id, 25 :title, :price, :required_time, :makeupkit, 26 :makeupkit_explain, :place, :place_memo, :memo, :posted_at, 27 :file, :tag_list, :genre_list, 28 lesson_images_attributes:[:id, :lesson_id, :lesson_image, :lesson_image_cache, :remove_lesson_image], 29 situation_ids:[], part_ids:[] 30 ] 31 params.require(:lesson).permit(attrs) 32 end 33 34 35end 36

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

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

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

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

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

guest

回答1

0

ベストアンサー

:firstが:firsになっていて
4000円と表示されていても
valueがnillになっていて
登録されていないのが原因じゃないですかね
:firstにすればいいかと

ruby

1<%= f.select :price, options_from_collection_for_select(Lesson::PRICE_LIST, :last, :first), {}, {class:"form-control"}%> 2

公式を見ると

options_from_collection_for_select(オブジェクトの配列, value属性の項目, textの項目 [, オプション])

となっているので本当は

ruby

1<%= f.select :price, options_from_collection_for_select(Lesson::PRICE_LIST, :first,:last), {}, {class:"form-control"}%> 2

な気がするのと
そもそも

ruby

1<%= f.select :price, Lesson::PRICE_LIST.to_a, {}, {class:"form-control"}%> 2

で十分なんじゃないかなぁと

投稿2017/07/06 00:29

編集2017/07/06 05:31
moke

総合スコア2241

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

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

innjera

2017/07/06 04:43

コメント有難う御座います。記載していた方はコピペミスで、実際には正しくfirstと入っています。失礼しました。ですので、正しくfirstを入れてもデフォルトの値に戻ってしまいます。。
moke

2017/07/06 07:52

回答を修正しました 最初から全部書いておくべきでしたね
innjera

2017/07/06 10:02

コメント有難う御座います。両方試しましたが、状況に変化有りませんでした。。 第四引数に以下の通りparams[:price]を入れても状況変わらずです。。。 <%= f.select :price, options_from_collection_for_select(Lesson::PRICE_LIST, :first, :last, params[:price]), {}, {class:"form-control"}%>
innjera

2017/07/06 10:44

申し訳有りません、<%= f.select :price, Lesson::PRICE_LIST.to_a, {}, {class:"form-control"}%>で問題なく動作しました!有難う御座います!!
moke

2017/07/06 11:39 編集

options_from_collection_for_select はrails4以降うまくいかないことが多いです 理由はわかりませんが、 pluck(:name,:id)ができるようになったので 乗り換えるといいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問