使用嵌套资源(rails)组织控制器的正确方法

时间:2011-10-03 18:04:53

标签: ruby-on-rails model-view-controller

我希望这个问题不是太主观,但是这里有。

为简单起见,我有一个包含许多嵌套资源的User模型。例如,@ user有很多@books,@ cars,@ friends。

在用户的“show”视图中,我向用户显示一个仪表板,该仪表板显示所有事物(书籍,汽车和朋友)的小部件。

我现在的问题是UsersController必须执行与书籍,汽车和朋友有关的任何/所有逻辑。在BooksController中放置Books等逻辑只是感觉不对。

2 个答案:

答案 0 :(得分:1)

在rails中,您可以在路由中使用嵌套资源,如此

resources :users do
  resources :books
end

这会给你类似的东西

/users/id_of_user/books

哪个会触及您的图书控制器的索引,只需检查图书控制器中的user_id可用性,然后获取附加到当前用户的所有图书。

使用您的控制器并以这种方式进行路由,您可以轻松地将逻辑分散到更适合的控制器,并使其远离用户控制器。

查看下面的文档,了解更多信息,例如新嵌套路径的snazy帮助程序。 http://guides.rubyonrails.org/routing.html#nested-resources

答案 1 :(得分:-1)

评论后不久,我在Rails指南中找到了:before_filter。使用此方法,您可以根据是否找到嵌套资源以及相关模板来调用操作。这就是我做的,对我来说效果很好!

   before_filter :user_resource

      def user_resource
        return unless params[:user_id]
        redirect_to root_url and return unless params[:user_id] == current_user.id.to_s
        action = :"user_#{params[:action]}"
        if self.methods.include? action
          self.send action
          render action
        end
      end

以及它调用的方法示例

  def user_index
    ads = Classified.where(:owner_id => params[:user_id])
    @classifieds = ads
  end