了解在控制器之间传递rails参数

时间:2014-08-26 23:31:47

标签: ruby-on-rails

我刚刚开始围绕rails中的参数。我目前正在开展一个公众无法访问的项目,因此在这种情况下保持params安全并不是一个优先事项。

我有一个link_to到另一个控制器动作,需要一个对象id来完成控制器动作。

  =link_to "Barcode", print_barcode_label_admin_items_path(:item_to_print => { :article_id => article.id }) 

然后在相关的控制器中

def print_barcode_label
    if params[:item_to_print][:article_id].present? 
    return if force_format :pdf

    ..........
private

def params_document
  params.require(:document).permit!
end 

当我编写这个控制器的代码时,我确定参数被传递(我正在使用better-errors gem来调试,所以我可以看到它们在请求参数哈希中传递)。但现在,不知道我做了什么,但我得到了错误

undefined method `[]' for nil:NilClass

在我的上述控制器操作中第2行失败。我确信有一些我非常缺席的东西。它是什么?有没有更有利的方法呢?

更新

所以我开始玩其他可能的解决方案,一个是命名一个专门带有参数

的路线
    get 'print_barcode_label/:article_id', to: 'documents#print_barcode_label', as: 'print_barcode_label'

这似乎是一种更加强大和明智的方法。尽管如此,尽管在链接中传递了变量,就像这样

      =link_to "Barcode", print_barcode_label_admin_items_path(article.id)

提供无路线匹配错误

No route matches {:action=>"print_barcode_label", :controller=>"admin/documents"} missing required keys: [:article_id]

1 个答案:

答案 0 :(得分:0)

如果没有在某些背景下看到更多代码,很难回答这个问题。但是如果你想做rails方式,你应该可以在文档资源上创建自定义操作。

在您的routes.rb中:

namespace :admin do
  resources :documents
    get :print_barcode_label, :on => :member
  end
end

然后您可以创建此操作的链接:

= link_to 'Barcode', print_barcode_label_admin_document_path(article)