如何在Rails form_for中正确传递外键

时间:2015-01-06 04:48:18

标签: ruby-on-rails

我目前有一个工作表单来创建资源(事件预订)belongs_to其他两个模型,Consumer(客户)和Course。在Booking创建表单中,我使用了两个隐藏字段,这些字段通过consumer_idcourse_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无法自动解决这个问题,我会感到惊讶,我只是不确定如何实现它。

1 个答案:

答案 0 :(得分:0)

它比你想象的要简单,你已经在那里大部分了。

创建booking时,您只需设置course_idconsumer_id字段,因此请确保您在表单中设置了隐藏字段,并使用这些名称和正确的价值观:

<%= f.hidden_field :course_id, value: my_course_id %>
<%= f.hidden_field :consumer_id, value: my_consumer_id %>

不要在控制器或表单中设置courseconsumer。也就是说,从控制器中删除以下行:

@booking.course = Course.find(@booking.course_id)
@booking.consumer = Consumer.find(@booking.consumer_id)

您的course_id列表中已有consumer_idpermit,因此当您发布表单时,这些参数的值将在新booking上设置,这就是你应该关心的一切。

当您尝试访问@booking.course时,ActiveRecord会根据find中设置的ID为您执行course_id;这是由您在模型中建立的belongs_to关联处理的。