77

我的账户索引页面列出了所有账户,每个账户都有一个“+服务”链接;这应该将用户引导至 /my_services/new 页面,并使用适当的 ID 预先填充 account_id 字段,具体取决于在 Accounts 索引页面上单击了哪个链接。

我在每个页面的底部都有调试(参数),并且我正在尝试,除了 :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

有人可以帮助以正确的方式做到这一点吗?我还没有尝试过一些讨厌的小东西。

编辑

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

resources :accounts, shallow: true do
  resources :services
end

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

<%= link_to "+ Service", new_service_path(:service => { :account_id => @account.id } ) %>
4

3 回答 3

119

首先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。在 rails 3 中,您可以使用强大的控件来过滤它所属的控制器中的有效参数。我强烈推荐。

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

另请注意,如果 account_id 不是由用户自由设置的(例如,用户只能为自己的单个 account_id 提交服务,那么最好不要通过请求发送它,而是在控制器中通过添加一些东西来设置它像:

@my_service.account_id = current_user.account_id 

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

希望这可以帮助

于 2012-05-27T12:06:57.603 回答
10

试试这个

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

于 2012-05-27T11:54:50.963 回答
2
link_to "+ Service", controller_action_path(:account_id => acct.id)

如果仍然无法正常工作,请检查路径:

$ rake routes
于 2016-03-02T09:56:13.447 回答