ruby-on-rails - 用于 Ruby 中嵌套路由的 DRY Controller

标签 ruby-on-rails ruby dry

我有一个使用以下模型设置的项目。每个 -> 代表一个 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/

相关文章:

ruby-on-rails - 未定义的局部变量或方法 `confirmed_at' 用于设计

ruby - `while ... end` 和 `while ... do ... end` 之间的区别

Javascript 等价于 Ruby 的 __LINE__ 和 __FILE__ 常量

在多种方法中找到的 WCF Web API UriTemplate 元素

language-agnostic - 如何在语言之间共享配置信息或业务规则

ruby-on-rails - Rails - 如何避免重复相同的 i18n 属性翻译

ruby-on-rails - Mongoid文件的生存时间

javascript - Rails 4 Flot 未捕获类型错误和错误显示

ruby-on-rails - 在 OSX 上使用 postgresql 测试数据库错误

ruby-on-rails - f.error_messages仅在基础中显示第一条错误消息