- 前提・実現したいこと
Railsで物件登録システムを作っています。
物件を登録する時に既に作られているモデルをチェックボックスから選択してそのチェックした個数と備考欄を子テーブルとして登録したいです。
このような要件の場合、どのようにしてチェックしたものを他情報を添えて登録することができるのでしょうか。
ご教示頂けますと幸いです。
なお質問要件の前はチェックしたものと物件を紐づけるのみでしたので、中間テーブルとして登録していました。
その時のモデルファイルが以下になります。
モデル
property
1 has_many :gifts, :dependent => :destroy 2 has_many :accessories, through: :gifts 3 accepts_nested_attributes_for :gifts, allow_destroy: true
gift
1 belongs_to :property, optional: true 2 belongs_to :accessory, optional: true
accessory
1 has_many :gifts 2 has_many :properties, through: :gifts 3
form
1 2_form.html.erb 3<%= form_with model:property, url:properties_path, local:true do |f| %> 4 5 <div class="container"> 6 7 <div class="row create-property-forms"> 8 <div class="col-7"> 9 10 <div class="card"> 11 <div class="card-header bg-gray">物件情報</div> 12 <div class="card-body"> 13 <!-- 基本情報 --> 14 <%= render :partial => "standard", :locals => { f: f } %> 15 <!-- テキストエリア --> 16 <%= render :partial => "textareas", :locals => { f: f } %> 17 <!-- 掲載期限 --> 18 <%= render :partial => "pereod", :locals => { f: f } %> 19 </div><!--左半分--> 20 21 <div class="col-5"> 22 <!-- 業態 --> 23 <%= render :partial => "business_lists", :locals => { f: f} %> 24 <!-- エリア --> 25 <%= render :partial => "area", :locals => { f: f} %> 26 <!-- 譲渡品 --> 27 <%= render :partial => "gifts", :locals => { f: f} %> 28 </div><!--右半分--> 29 30 </div><!--全体ラップ--> 31 </div><!--container--> 32 33 <div class="container"> 34 <!-- トップ画像 --> 35 <%= render :partial => "top_image", :locals => { f: f} %> 36 <!-- 複数画像 --> 37 <%= render :partial => "many_image", :locals => { f: f} %> 38 </div> 39 40 <!-- 追従 --> 41 <div class="fixed-box"> 42 <div class="container"> 43 <div class="d-flex justify-content-between"> 44 <div class=""> 45 <div class="secret-check"> 46 <label for="secret_check" name="会員のみ公開" class="text-white"> 47 <%= f.check_box :secret, cheked:true, id:"secret_check" %> 48 会員のみ公開</label> 49 </div> 50 <div class="recommend-check"> 51 <label for="recommend_check" name="おすすめに表示する" class="text-white"> 52 <%= f.check_box :recommend, cheked:true, id:"recommend_check" %> 53 おすすめに表示する</label> 54 </div> 55 </div> 56 <div class="my-2"><%= f.submit "登録", class:"btn btn-primary px-5 fixed-submit" %></div> 57 </div> 58 </div> 59 </div> 60 61<% end %><!-- formend --> 62 63<style media="screen"> 64 .last-margin { 65 margin-bottom: 10rem!important; 66 } 67 .station_select { 68 width: 200px; 69 } 70</style> 71 72 73 74<script type="text/javascript"> 75 76 $(document).ready(function(){ 77 $('#property_pref').change(function(){ 78 var pref_id = $('#property_pref') .val(); 79 $.get("/properties/city", 80 {pref_id: pref_id}, 81 function(data){} 82 ); 83 }) 84 85 $('#property_pref').change(function(){ 86 var pref_id = $('#property_pref') .val(); 87 $.get("/properties/station", 88 {pref_id: pref_id}, 89 function(data){} 90 ); 91 }) 92 }); 93 94</script>
gifts
1_gifts.html.erb 2 <div class="card my-2"> 3 <span class="card-header">譲渡品</span> 4 5 <div class="rounded card-body p-3 m-3 acc-table-innner" id="acc_chk"> 6 <%= f.collection_check_boxes(:accessory_ids, Accessory.all, :id, :name, include_hidden: false) do |b| %> 7 <%= b.label { b.check_box + b.text } %> 8 <div> 9 <%= f.number_field :stock, name: "property[gift][#{b.value}][stock]" %> 10 <%= f.text_field :remark, placeholder: "備考を入力" ,name: "property[gift][#{b.value}][remark] " %> 11 </div> 12 13 <% end %> 14 15 </div> 16 </div>
controller
1 def create 2 @property = Property.new(property_params) 3 4 respond_to do |format| 5 if @property.save! 6 7 # ギフト作成 8 params[:property][:accessory_ids].each do | accessory_id | 9 @property.gifts.create( 10 accessory_id: accessory_id, 11 stock: params[:property][:gift][accessory_id][:stock], 12 remark: params[:property][:gift][accessory_id][:remark] 13 ) 14 end 15 16 params[:property_images][:image].each do |image| 17 @property.property_images.create!(image: image, property_id: @property.id) 18 end 19 20 flash.now[:alert] = "#{@property.title}を作成しました。" 21 redirect_to property_new_path 22 else 23 flash.now[:alert] = "物件作成に失敗しました" 24 format.html { render :new } 25 format.json { render json: @property.errors, status: :unprocessable_entity } 26 end 27 end 28 end 29 30 private 31 def property_params 32 params.require(:property).permit(:title, :preperty_no,:control_num,:price,:deposit,:admin_const, 33 :othoer_price,:facility,:street_address,:traffic,:age,:area, 34 :floor,:parcel,:construction,:parking,:parking_exp,:contract_method,:contract_period,:time,:secret, 35 :recommend,:current_status,:list_comment,:detail_comment,:recommend_comment, :pref ,:city, :station, 36 :inu_or_suke, :end_on, :image, 37 area_tag_ids: [],category_ids: [], 38 preperty_images_attributes: [:image, :id, :_destroy]).merge(user_id: current.id) 39 end
回答1件
あなたの回答
tips
プレビュー