2012-05-27 74 views
55

我的账户索引页面列出所有账户,并且每个账户都有一个链接到“+ Service”;这应该将用户引导至/ my_services/new页面,并根据在“帐户”索引页面上单击的链接,使用适当的ID预填充account_id字段。Rails - 传递参数到link_to

我在每个页面的底部都有调试(params),并且我正在尝试,除此之外,我没有获得任何其他内容:controller和:action显示在我的参数中,作为/ 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 }) %> 

回答

85

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

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

我认为最好的做法是通过模型值作为PARAM嵌套:

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使用角色:但通过添加类似设置在控制器内。

希望这有助于

+0

我不知道这是否会工作的link_to “服务”, “?my_services /新ACCOUNT_ID =” + acct.id –

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

如果仍然没有工作检查路径:

$ rake routes