Jor*_*sen 9 ruby-on-rails ruby-on-rails-4
我有这些模型(为便于阅读而简化):
class Place < ActiveRecord::Base
has_many :business_hours, dependent: :destroy
accepts_nested_attributes_for :business_hours
end
class BusinessHour < ActiveRecord::Base
belongs_to :place
end
Run Code Online (Sandbox Code Playgroud)
而这个控制器:
class Admin::PlacesController < Admin::BaseController
def update
@place = Place.find(params[:id])
if @place.update_attributes(place_params)
# Redirect to OK page
else
# Show errors
end
end
private
def place_params
params.require(:place)
.permit(
business_hours_attributes: [:day_of_week, :opening_time, :closing_time]
)
end
end
Run Code Online (Sandbox Code Playgroud)
我有一个动态的表单,通过javascript呈现,用户可以添加新的开放时间.提交这些开放时间时,我想总是替换旧的(如果存在的话).目前,如果我通过params发送值(例如):
place[business_hours][0][day_of_week]: 1
place[business_hours][0][opening_time]: 10:00 am
place[business_hours][0][closing_time]: 5:00 pm
place[business_hours][1][day_of_week]: 2
place[business_hours][1][opening_time]: 10:00 am
place[business_hours][1][closing_time]: 5:00 pm
Run Code Online (Sandbox Code Playgroud)
......等等
这些新的营业时间会添加到现有营业时间.有没有办法告诉rails总是替换营业时间,还是我每次都要手动清空控制器中的集合?
小智 8
位优化解决方案@robertokl,以减少数据库查询的数量:
def business_hours_attributes=(*args)
self.business_hours.clear
super(*args)
end
Run Code Online (Sandbox Code Playgroud)
这是我能得到的最好的:
def business_hours_attributes=(*attrs)
self.business_hours = []
super(*attrs)
end
Run Code Online (Sandbox Code Playgroud)
希望还不算太晚。
您错过了 business_hours 的 id 尝试:
def place_params
params.require(:place)
.permit(
business_hours_attributes: [:id, :day_of_week, :opening_time, :closing_time]
)
end
Run Code Online (Sandbox Code Playgroud)
这就是表单添加新记录而不是更新记录的原因。
| 归档时间: |
|
| 查看次数: |
1775 次 |
| 最近记录: |