Rails - 在link_to中传递参数

bdx*_*bdx 69 ruby-on-rails

我的帐户索引页面列出了所有帐户,每个帐户都有一个"+服务"链接; 这应该将用户定向到/ my_services/new页面并使用适当的ID预先填充account_id字段,具体取决于在"帐户"索引页面上单击的链接.

我在每个页面的底部都有调试(params),并且我正在尝试的,除了:controller和:在我的/ my_services/new页面的参数中显示的操作之外,我没有得到任何其他内容.

我一直在尝试的链接是这样的:

link_to "+ Service", "my_services/new", :account_id => acct.id
Run Code Online (Sandbox Code Playgroud)

然后我在服务控制器中也有逻辑:

def new
  @my_service = MyService.new
  if params[:account_id]
    @my_service.account_id = params[:account_id]
  end
end
Run Code Online (Sandbox Code Playgroud)

有人可以帮助正确的方法吗?我还没有能够通过我尝试过的一些讨厌的小东西来实现它.

编辑

事实证明,如果有人shallow: true在将来看这个答案,嵌套资源(可能在routes.rb中有选项)似乎是要走的路.我对此部分的routes.rb现在看起来像这样:

resources :accounts, shallow: true do
  resources :services
end
Run Code Online (Sandbox Code Playgroud)

我的链接现在看起来像这样:

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>
Run Code Online (Sandbox Code Playgroud)

Vik*_*rón 103

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

link_to "+ Service", new_my_service_path(:account_id => acct.id)
Run Code Online (Sandbox Code Playgroud)

我认为最好的做法是将模型值作为嵌套在其中的参数传递:

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
Run Code Online (Sandbox Code Playgroud)

并且您需要控制account_id被允许进行"质量分配".在rails 3中,您可以使用强大的控件来过滤控制器所属的有效参数.我强烈推荐.

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

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

@my_service.account_id = current_user.account_id 
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助


abh*_*has 9

试试这个

link_to "+ Service", my_services_new_path(:account_id => acct.id)
Run Code Online (Sandbox Code Playgroud)

它将根据您的需要传递account_id.

有关link_to的更多详细信息,请使用此http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to