Rails - 在 link_to 中传递参数

84
我的帐户索引页面列出所有帐户,并为每个帐户提供一个“+服务”链接;这应该将用户重定向到/my_services/new页面,并在账户ID字段中预填充适当的ID,具体取决于在帐户索引页面上点击哪个链接。
我在每个页面底部使用debug(params),但是在我尝试的情况下,除了控制器和操作之外,我的参数中没有其他内容显示在/my_services/new页面上。
我一直在尝试的链接是这样的:
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 } ) %>
3个回答

124

首先,`link_to`是一个HTML标签助手,它的第二个参数是URL,后跟HTML选项。您想要的是将`account_id`作为URL参数传递给路径。 如果您已经在`routes.rb`中正确设置了命名路由,则可以使用路径助手。

link_to "+ Service", new_my_service_path(:account_id => acct.id)

我认为最佳实践是将模型值作为嵌套在<model_name>内的参数进行传递:

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在“大规模分配”中被允许。在Rails 3中,您可以使用强大的控件在控制器中过滤有效的参数。我强烈推荐这样做。

http://apidock.com/rails/ActiveModel/MassAssignmentSecurity/ClassMethods

还要注意,如果account_id不是由用户自由设置的(例如,用户只能为自己的单个account_id提交服务),那么最好不要通过请求发送它,而是通过添加类似以下内容在控制器中设置:

@my_service.account_id = current_user.account_id 

如果您只允许用户在自己的帐户上创建服务,但允许管理员通过在attr_accessible中使用角色来创建任何人的服务,则可以将两者结合起来。


我在想这个会不会起作用 link_to "服务", "my_services/new?account_id="+acct.id - Zia Ul Rehman Mughal

13

2
link_to "+ Service", controller_action_path(:account_id => acct.id)

如果仍然没有起作用,请检查路径:
$ rake routes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接