My accounts索引页面列出了所有帐户,并且每个帐户都有一个指向"+ Service“的链接;这应该将用户定向到/my_services/新页面,并且已经使用适当的ID预先填充了account_id字段,具体取决于在帐户索引页面上单击的链接。
我在每个页面的底部都有debug(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
有没有人能帮我找个合适的方法呢?我还没能用我试过的一些令人讨厌的小东西让它继续下去。
编辑
事实证明,如果将来有人考虑这个问题,嵌套资源(可能使用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 } ) %>
发布于 2012-05-27 20:06:58
首先,link_to是一个html标签助手,它的第二个参数是url,然后是html_options。您想要的是将account_id作为url参数传递给路径。如果已在routes.rb中正确设置了命名路由,则可以使用路径帮助器。
link_to "+ Service", new_my_service_path(:account_id => acct.id)
我认为最好的做法是将模型值作为嵌套的参数传递:
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进行“批量分配”。在Rails3中,您可以使用强大的控件来过滤控制器中的有效参数。我强烈推荐。
http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods
还请注意,如果account_id不是由用户自由设置的(例如,用户只能为自己的单个account_id提交服务,那么更好的做法是不通过请求发送它,而是通过添加以下内容在控制器中设置它:
@my_service.account_id = current_user.account_id
如果您只允许用户在自己的帐户上创建服务,但允许管理员通过在attr_accessible中使用角色来创建任何人的服务,那么您可以将两者结合起来。
希望这能有所帮助
发布于 2012-05-27 19:54:51
尝尝这个
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
发布于 2016-03-02 17:56:13
link_to "+ Service", controller_action_path(:account_id => acct.id)
如果它仍然不工作,请检查路径:
$ rake routes
https://stackoverflow.com/questions/10773695
复制相似问题