【问题标题】:Rails creating association objects: how do I pass the information back to the other controller?Rails 创建关联对象:如何将信息传递回另一个控制器?
【发布时间】:2014-12-23 20:07:56
【问题描述】:

我有一个带有以下内容的 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 %>

我是个很菜鸟,我知道这个问题以前可能已经被问过。但是,我不确定如何将allthedifferent 的一些信息应用于我的问题。我尝试将轨道作为参数传递

<%= 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,因为在我看过的所有问题/教程中,都没有出现过这样的情况。如果有人能解释我如何直接(当然在功能上)实现这一点,我将不胜感激......

【问题讨论】:

    标签: ruby-on-rails ruby activerecord associations


    【解决方案1】:

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

    <%= 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_id 并将其与其他属性一起发送到您的 create 方法:

    <%= f.hidden_field :track_id %>
    

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

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

    【讨论】:

    • 感谢您的宝贵时间...我按照您所说的做了,但它不起作用,当我这样做时,记录已创建但 track_id 未保存。 (在@record = ... 行中,我将track.id 换成了@track.id,我认为这是一个错字)。我还缺少其他明显的东西吗?
    • @Thornshadow17432:我在下一步更新了我的答案,因为您需要将表单中的track_id 传递回create 方法。
    猜你喜欢
    • 2010-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    • 2020-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多