我的应用程序控制器中有这个辅助方法:
def current_team
@current_team ||= Team.find(params[:team_id])
end
问题是,它适用于以下格式的网址:
/teams/20/members/11
但它不起作用:
/teams/20
为了让它适用于那些人,我必须将:team_id
更改为:id
。
我怎样才能整理它以便它“正常”?
谢谢!
答案 0 :(得分:1)
在控制器中设置实例变量(@current_team
),从不在帮助器中。这不是帮助者的目的。
如果您遵循此建议,您自然会在TeamsController中使用params[:id]
,但在MembersController中使用params[:team_id]
。
(有些人甚至继续说你根本不应该使用帮助。为了便于演示(自定义链接,按钮,表格等),他们建议使用Presenter pattern。但是你不必听他们。:))
答案 1 :(得分:0)
这不是最好的事情,但要做到这一点,你可以做到以下几点:
def current_team
@current_team ||= Team.find(params[:team_id].presence || params[:id])
end
有关Object.presence
方法的文档:
http://api.rubyonrails.org/classes/Object.html#method-i-presence
@SergioTulentsev是对的,你不应该在助手中设置实例变量,只能在控制器中。
答案 2 :(得分:0)
我假设除了Team
之外你还有其他资源。 Rails将为您的所有资源使用:id
参数。您需要查看自定义teams#show
操作的路由。在Rails 4中比在Rails 3中更容易。
请查看这篇文章,了解血腥细节:Change the name of the :id parameter in Routing resources for Rails
答案 3 :(得分:0)
我不会params[:team_id] || params[:id]
,因为在某些控制器上下文中,您会得到id
参数,该参数表示除Team
以外的其他内容的ID。假设/teams/:id
路由由TeamsController
处理,那么您可以执行以下操作(将您的方法保留在ApplicationController
中,并避免在不同的控制器中重复自己):
def current_team
id = controller_name == "teams" ? params[:id] : params[:team_id]
@current_team ||= Team.find(id)
end
或者,您可以更改路由,以便显示Team
的网址为/teams/:team_id
并按原样保留帮助程序,但这会违反Rails路由惯例。