Ruby on rails 如何正确通过Rails表单中的外键

Ruby on rails 如何正确通过Rails表单中的外键,ruby-on-rails,Ruby On Rails,我目前有一个创建资源(活动预订)的工作表单,属于另外两个模型,一个消费者(客户)和一个课程。在Booking创建表单中,我使用了两个隐藏字段,它们通过consumer\u id和course\u id 为了在表单中为工作,我在预订模型中创建了两个虚拟属性 attr_accessor :course_id, :consumer_id 在BookingsController的create事件中,我从批量分配中获取了这些ID,然后从ID中手动分配了实际的课程和消费者对象 预订控制器.rb def c

我目前有一个创建资源(活动预订)的工作表单,
属于
另外两个模型,一个
消费者(客户)和一个
课程
。在
Booking
创建表单中,我使用了两个隐藏字段,它们通过
consumer\u id
course\u id

为了在
表单中为
工作,我在
预订
模型中创建了两个虚拟属性

attr_accessor :course_id, :consumer_id
BookingsController
create
事件中,我从批量分配中获取了这些ID,然后从ID中手动分配了实际的
课程
消费者
对象

预订控制器.rb

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
course
,希望Rails能够看到该值是一个ID,并自动为我执行
.find
,但事实并非如此。如果Rails不能自动处理这个问题,我会感到惊讶,我只是不知道如何实现它。

这比你想象的要简单,而且你已经完成了大部分工作

创建
预订
时,您只需设置
课程id
消费者id
字段,因此请确保在表单中设置了隐藏字段,其中包含以下名称和正确的值:

<%= f.hidden_field :course_id, value: my_course_id %>
<%= f.hidden_field :consumer_id, value: my_consumer_id %>
您的
许可证
列表中已经有
课程id
消费者id
,因此当您发布表单时,这些参数的值将在新的
预订
中设置,这是您应该关心的全部


当您尝试访问
@booking.course
时,ActiveRecord将根据
课程id
中设置的id为您执行
查找
;这是由您在模型中建立的
属于
关联处理的。

好的,所以我尝试了错误的方法。我将字段命名为
course
consumer
(没有“_id”后缀),并希望Rails能够自动处理它,但我没有尝试其他方法。嵌套资源呢?这在这里是适用的还是只适用于一个嵌套资源?PS:我刚刚开始测试,但它似乎不起作用?我不确定您对嵌套资源的要求是什么;似乎你应该在这个主题上发布一个新问题(如果你觉得这个答案解决了原来的问题,那么在接受这个答案之后)。你是对的,一个新问题是最好的。尽管如此,我还没有接受这个答案,因为它似乎不起作用。我已经删除了手动将
课程
消费者
分配给
@booking
的行,但我只是得到了一系列错误。很快会发回更多细节。是的,细节会很有帮助。
@booking.course = Course.find(@booking.course_id)
@booking.consumer = Consumer.find(@booking.consumer_id)