ruby-on-rails Rails -在link_to中传递参数

shyt4zoc  于 2022-12-24  发布在  Ruby
关注(0)|答案(3)|浏览(131)

我的帐户索引页列出了所有帐户,每个帐户都有一个链接到"+服务";这应该会将用户定向到/my_services/new页面,并根据在Accounts索引页面上单击的链接,使用适当的ID预填充account_id字段。
我在每个页面的底部都有debug(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 } ) %>
au9on6nz

au9on6nz1#

首先,link_to是一个html标记帮助器,它的第二个参数是url,后面跟着html_options。你想要的是把account_id作为url参数传递给path。如果你已经在routes.rb中正确地设置了命名路由,你可以使用path帮助器。

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中的角色创建任何人的帐户,那么您当然可以将两者结合起来。

lnlaulya

lnlaulya2#

试试这个

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

它将根据您的需要传递account_id。
For more details on link_to use this http://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to

0md85ypi

0md85ypi3#

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

如果它仍然不工作,请检查路径:

$ rake routes

相关问题