1

我有一个使用以下模型设置的项目。每个->代表一个has_many关系:

Users->Goals->Milestones

我的路线Milestones看起来像这样:

  user_goal_milestones GET    /users/:user_id/goals/:goal_id/milestones(.:format)          milestones#index
                         POST   /users/:user_id/goals/:goal_id/milestones(.:format)          milestones#create
 new_user_goal_milestone GET    /users/:user_id/goals/:goal_id/milestones/new(.:format)      milestones#new
edit_user_goal_milestone GET    /users/:user_id/goals/:goal_id/milestones/:id/edit(.:format) milestones#edit
     user_goal_milestone GET    /users/:user_id/goals/:goal_id/milestones/:id(.:format)      milestones#show
                         PUT    /users/:user_id/goals/:goal_id/milestones/:id(.:format)      milestones#update
                         DELETE /users/:user_id/goals/:goal_id/milestones/:id(.:format)      milestones#destroy

我发现自己在 Milestones 控制器中的许多“功能”中做了很多这样的事情:

def index do
    @user = User.find(params[:user_id])
    @goal = Goal.find(params[:goal_id])
end

def edit do
    @user = User.find(params[:user_id])
    @goal = Goal.find(params[:goal_id])
end

我怎样才能修改我的控制器,这样我就不必一直定义@user@goal?我尝试将它们直接放在顶部,就在类定义块开始之后,但它不起作用。

4

2 回答 2

2

如果参数始终相同,您可以创建这样的方法

def set_user_and_goal
    @user = User.find(params[:user_id])
    @goal = Goal.find(params[:goal_id])

end

并将其放在顶部的 before_filter 中

before_filter :set_user_and_goal

并将其设置为您喜欢的任何操作

before_filter :set_user_and_goal, :only => [:edit, :index]

编辑:

此外,为了确保它不会在你的脸上爆炸,你可以这样做

@user = params.has_key?(:user_id) ? User.find(params[:user_id]) : nil

并根据要求..通过执行类似的操作确保目标属于用户

@goals = @user.goals.find(params[:goal_id])
于 2013-04-14T04:15:20.813 回答
1

你总是定义自己的辅助方法

def goal_milestone(goal)
  user_goal_milestone(goal.user, goal)
end

您可以将它添加到您的 application_helper,然后在您的任何视图中使用任何。这将创建您在问题中提出的小型辅助方法。

寻找可以为您执行此操作的 gem 并没有向我展示任何内容,但是您可以以通用方式自己编写代码。

于 2013-04-14T04:15:05.710 回答