【问题标题】:Rails - Searching for another class in a controllerRails - 在控制器中搜索另一个类
【发布时间】:2014-10-29 02:17:49
【问题描述】:

我有两个班级 - ClassB 属于_to ClassA has_many ClassB。

我想要 class_a/index.html.erb 中的链接以基于 ClassA 索引中选择的 ClassA 对象创建新的 ClassB 对象 - 所以 class_a/index.html.erb 包括

@class_a.each do |object|
   ..object display..
   link_to 'new ClassB', new_class_b_path(pass the ClassA param to the new ClassB object here)
end

我以为我必须这样传递参数 -

new_class_b_path(class_a_id: object.id)

我在 ClassB 控制器中有以下内容 -

@class_a = ClassA.find(params[:class_a_id])
@class_b = @class_a.class_bs.build

...但是我收到以下错误。我哪里错了?

ActiveRecord::RecordNotFound in ClassBController#new Couldn't find ClassA without an ID

【问题讨论】:

  • new_class_b_path(params[class_a_id: object.id]) 它应该类似于 new_class_b_path(class_a_id: object.id) 不需要 params 在控制器中使用 params[:class_a_id]` 来获取 params
  • 嗨 - 仍然没有快乐。我知道 object.id 是有效的,因为我现在在代码中有一行检查它。似乎 object.id 没有被传递到 ClassBController。

标签: ruby-on-rails ruby-on-rails-4 routes params


【解决方案1】:

您只需要通过您的链接传递一个参数,如下所示:

@class_a.each do |object|
   ..object display..
   <%= link_to 'new ClassB', new_class_b_path(class_a_id: object.id) %>
end

在您的 Cals b 控制器中

def new
  @class_a = ClassA.find(params[:class_a_id])
  @class_b = @class_a.class_bs.build
end 

并以您的形式:

<%= form_for @class_b |f| %>

<%= f.hidden_feild  :class_a_id %>

 ... skipped code ...


<% end %>

【讨论】:

  • 您好,谢谢您,但是,它似乎没有通过 object_a_id - 我已经更新了问题:)
  • 不需要像new_class_b_path(params[class_a_id: object.id])这样的路径传递婴儿车你需要像我在回答中建议的那样传递
【解决方案2】:

new_class_b_path(params[class_a_id: object.id]) 应该类似于new_class_b_path(class_a_id: object.id) 不需要params,而您从view 发送params 使用参数[:class_a_id]in controller to get the 参数`

它看起来像

在视图中

 @class_a.each do |object|
   ..object display..
   link_to 'new ClassB', new_class_b_path(class_a_id: object.id)
 end

在控制器中

def new
  @class_a = ClassA.find(params[:class_a_id])
 end

为了逃避异常,您可以在控制器中执行此操作

 def new
  @class_a = ClassA.where(id: params[:class_a_id])
  @class_a.try(:class_bs).try(:build)
 end

【讨论】:

  • 您好 - 感谢您的回答,但是我收到一条错误消息,提示 id 没有被传递到控制器中 - 您有什么问题吗?我已经更新了问题 - 干杯,丹
  • 是的,请发布整个控制台输出(日志)以便于弄清楚
  • object.idnil 所以 ClassA.find(nil) 引发异常
  • 嗨 - 在 ClassA 索引视图中,我有 - 视图中的 object.id 不是 nil。您对帖子所做的编辑是什么?干杯,丹
  • 请查看我编辑的帖子...使用最后编辑的控制器操作
猜你喜欢
  • 2011-04-30
  • 2016-04-22
  • 2016-05-12
  • 2012-07-19
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多