Rails – 在link_to中传递参数
我的帐户索引页面列出所有帐户,并且每个帐户都有一个链接到“+服务”; 这应该引导用户到/ my_services /新页面,并预先填充account_id字段与适当的ID,这取决于哪个链接被点击的帐户索引页面上。
我在每个页面的底部都有debugging(params),而且我正在尝试的是,除了:/ my_services / new页面的参数中显示的controller::action之外,我没有得到任何东西。
我一直在尝试的链接是这样的:
link_to "+ Service", "my_services/new", :account_id => acct.id
然后我在服务控制器中也有逻辑:
def new @my_service = MyService.new if params[:account_id] @my_service.account_id = params[:account_id] end end
有人可以帮助正确的方式做到这一点? 我还没有能够用我尝试过的一些讨厌的小黑客事情得到它。
编辑
事实certificate,如果有人在将来看到这个答案,嵌套的资源(可能与在routes.rb中的shallow: true
选项)似乎是要走的路。 这部分我的routes.rb现在看起来像这样:
resources :accounts, shallow: true do resources :services end
我的链接现在看起来像这样:
<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>
首先,link_to是一个html标签助手,第二个参数是url,后面是html_options。 你想要的是将account_id作为URLparameter passing给path。 如果您在routes.rb中正确设置了命名路由,则可以使用path助手。
link_to "+ Service", new_my_service_path(:account_id => acct.id)
我认为最好的做法是将模型值作为一个嵌套的parameter passing给:
link_to "+ Service", new_my_service_path(:my_service => { :account_id => acct.id }) # my_services_controller.rb def new @my_service = MyService.new(params[:my_service]) end
而且你需要控制account_id被允许进行“批量分配”。 在轨道3中,您可以使用强大的控件来过滤它所属的控制器内的有效参数。 我强烈推荐。
http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods
还要注意的是,如果account_id不是由用户自由设置的(例如,用户只能为自己的单一account_id提交服务,那么最好不要通过请求发送它,而是通过添加一些东西喜欢:
@my_service.account_id = current_user.account_id
如果您只允许用户自己创build服务,但是允许pipe理员使用attr_accessible中的angular色来创build任何人,那么您一定可以将两者结合起来。
希望这可以帮助
尝试这个
link_to "+ Service", my_services_new_path(:account_id => acct.id)
它会传递你想要的account_id。
有关link_to的更多详情,请使用http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to
link_to "+ Service", controller_action_path(:account_id => acct.id)
如果它仍然不工作检查path:
$ rake routes