将Rails模型传递给子控制器

时间:2014-06-10 19:10:11

标签: ruby-on-rails ruby controller

我有以下网址/purchases/3/payments/new,我通过

进入购买控制器
link_to 'pay', purchase_path(purchase)+new_payment_path

现在在支付控制器中,我需要拥有购买对象,或者至少从调用它的位置获取其ID。 我尝试使用param,但还有其他方法吗? 感谢

2 个答案:

答案 0 :(得分:2)

使用params是有道理的。

您应该能够在支付控制器中获得这样的购买ID:

params[:purchase_id]

但是,需要以特定方式设置路线才能执行此操作:

resources :purchases do
  resources :payments
end

然后你可以在视图中创建这样的链接:

link_to 'pay', new_purchase_payment_path(purchase)

也可以查看这些文档:http://guides.rubyonrails.org/routing.html#nested-resources

答案 1 :(得分:0)

<强>路线

我立即强调这是一个问题:

 purchase_path(purchase)+new_payment_path

这非常糟糕(超出约定的配置) - 使用实际的路径助手加载所需的资源(保持干燥和传统)会更好

-

<强>嵌套

Jon M所述,您的解决方案将来自nested resources的使用:

#config/routes.rb
resources :purchases do
    resources :payments  # -> domain.com/purchases/:purchase_id/payments/new
end

这将允许您使用Jon所述的路径路径。

-

<强>控制器

  

在支付控制器中我需要有购买对象,   或其ID

通过使用嵌套资源,如上所述,该路线将点击您的payments控制器并提供以下param

params[:purchase_id]

注意 param的命名(只有nested资源标识为params[:id]),如所示in the docs/magazines/:magazine_id/ads/:id

我建议您在控制器中使用以下代码:

#app/controllers/payments_controller.rb
class PaymentsController < ApplicationController
   def new
       @purchase = Purchase.find params[:purchase_id]
   end
end