我目前有一个工作表单来创建资源(事件预订)belongs_to
其他两个模型,Consumer
(客户)和Course
。在Booking
创建表单中,我使用了两个隐藏字段,这些字段通过consumer_id
和course_id
。
为了在form_for
中工作,我在Booking
模型中创建了两个虚拟属性
attr_accessor :course_id, :consumer_id
在create
BookingsController
的{{1}}事件中,我从质量分配中抓取了这些ID,然后手动分配了实际的Course
和{{1} ID中的对象
bookings_controller.rb
Consumer
这是最佳做法吗?我试图将表单隐藏字段命名为def create
@booking = Booking.new(booking_params)
@booking.course = Course.find(@booking.course_id)
@booking.consumer = Consumer.find(@booking.consumer_id)
if @booking.save_with_payment
# Payment was successful, redirect to users account page to view it and past bookings
else
render :new
end
end
private
def booking_params
params.require(:booking).permit(:course_id, :consumer_id, :card_token, :visible, :created_at)
end
和consumer
,希望Rails会看到该值是一个ID并自动为我做course
,但这并不是似乎是这样的。如果Rails无法自动解决这个问题,我会感到惊讶,我只是不确定如何实现它。
答案 0 :(得分:0)
它比你想象的要简单,你已经在那里大部分了。
创建booking
时,您只需设置course_id
和consumer_id
字段,因此请确保您在表单中设置了隐藏字段,并使用这些名称和正确的价值观:
<%= f.hidden_field :course_id, value: my_course_id %>
<%= f.hidden_field :consumer_id, value: my_consumer_id %>
不要在控制器或表单中设置course
或consumer
。也就是说,从控制器中删除以下行:
@booking.course = Course.find(@booking.course_id)
@booking.consumer = Consumer.find(@booking.consumer_id)
您的course_id
列表中已有consumer_id
和permit
,因此当您发布表单时,这些参数的值将在新booking
上设置,这就是你应该关心的一切。
当您尝试访问@booking.course
时,ActiveRecord会根据find
中设置的ID为您执行course_id
;这是由您在模型中建立的belongs_to
关联处理的。