参与并选择正确的

时间:2014-02-04 17:58:16

标签: ruby-on-rails ruby-on-rails-3

我的应用程序控制器中有这个辅助方法:

def current_team
    @current_team ||= Team.find(params[:team_id])
end

问题是,它适用于以下格式的网址:

/teams/20/members/11

但它不起作用:

/teams/20

为了让它适用于那些人,我必须将:team_id更改为:id

我怎样才能整理它以便它“正常”?

谢谢!

4 个答案:

答案 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路由惯例。