创建关联对象的Rails:如何将信息传递回另一个控制器?

时间:2014-12-23 20:07:56

标签: ruby-on-rails ruby activerecord associations

我有一个带有以下内容的rails项目:

record.rb

class Track < ActiveRecord::Base
has_many :records
end

track.rb

class Record < ActiveRecord::Base
belongs_to :track
end

(顺便说一句,我的意思是这种联想,而不是像音乐行业那样!在这种情况下,一个轨道就像一个特定的类,一个记录将是一个特定的考试等级。每个轨道有多个记录,每条记录只能属于一条轨道等。)

然后在tracks/show.html.erb中,我列出了属于特定轨道的所有记录。在底部,我想要一个“添加”链接,即类似

<%= link_to 'Add', new_record_path %>

我是铁杆菜鸟,我知道之前可能已经提出这个问题了。但是,我不确定如何将all the different位信息应用到我的问题中。我尝试将轨道作为参数传递给

<%= link_to 'Add', new_record_path(@track) %>

并在records_controller.rb中定义new方法,如下所示

def new(track)
@record = Record.new
@record.track_id = track.id
end

但是我得到了错误wrong number of arguments (0 for 1),我认为这让我感到困惑,因为我在控制器中指定new应该接受一个参数。无论如何,我怀疑这种方法是错误的,或者至少不像Ruby那样,因为在我看过的所有问题/教程中,都没有出现过这样的问题。如果有人能解释我如何能够直截了当地实现这一点(当然还有功能性的话),我将不胜感激......

1 个答案:

答案 0 :(得分:0)

您可以在链接中传递该值:

<%= link_to 'Add', new_record_path(track_id: @track.id) %>

然后在records_controller.rb

中使用它
def new
  @track = Track.find(params[:track_id])
  @record = Record.new(track_id: @track.id)
  ...
end

下一步是您需要在new表单中设置一个隐藏字段,该字段将track_idcreate方法一起发送,并将其与其他属性一起发送到您的<%= f.hidden_field :track_id %> 方法:

create

如果将track_id与所有其他参数传递给new方法,则track_id方法不需要任何机会。只需检查您是否在record_params方法中将{{1}}包含在允许的属性中。

另一种选择可能是将记录路由配置为nested rescource。我不知道在数据库模型的逻辑视图中这是否有意义。