我有一个使用以下模型设置的项目。每个 ->
代表一个 has_many
关系:
Users->Goals->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 Controller 的许多“功能”中做了很多这样的事情:
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
如何修改我的 Controller ,这样我就不必一直定义 @user
和 @goal
了?
我尝试将它们直接放在顶部,紧跟在类定义 block 的开始之后,但是没有用。
最佳答案
如果参数始终相同,您可以创建这样的方法
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
并将其设置为您喜欢的任何 Action
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])
关于ruby-on-rails - 用于 Ruby 中嵌套路由的 DRY Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15995710/