【问题标题】:rails controller for mixed nested and non-nested resources用于混合嵌套和非嵌套资源的 rails 控制器
【发布时间】:2012-01-15 14:32:59
【问题描述】:

我正在开发一个类似应用程序的博客, 我的用户模块 has_many 帖子和帖子模块属于_to 用户

我想同时访问 users/:id/posts 和 posts/

routes.rb 是这样的:

resources :users do
  resources :posts
end

resources:posts

我如何知道 post 控制器是直接访问 (/posts) 还是通过嵌套路由 (/users/:id/posts) 访问?

例如,posts 控制器的 index 方法应该是什么,以便为 /users/:id/posts 和 /posts 执行正确的 INDEX 操作

有没有更好的方法来做到这一点?

【问题讨论】:

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


    【解决方案1】:

    一种解决方案是在控制器上使用前置过滤器,例如:

    before_filter :load_user
    
    def load_user
      @user = User.find(params[:user_id]) if params[:user_id]
      @posts = @user ? @user.posts : Post.scoped
    end
    

    然后你必须稍微重写你的控制器才能正常工作。

    index 操作无需重构,@posts 已正确加载,但您可以根据需要进行进一步过滤

    def index
      @posts = @posts.where('updated_at < ?' Time.now)
    end
    

    然后更新每个成员操作:新建、创建、显示、编辑、更新、销毁和使用帖子作为基础,例如:

    def new
      @post = @posts.build
    end
    
    def create
      @post = @posts.build(params[:task])
    end
    
    def show
      @post = @posts.find(params[:id])
    end
    
    def edit
      @post = @posts.find(params[:id])
    end
    
    def update
      @post = @posts.find(params[:id])
    end
    
    def destroy
      @post = @posts.find(params[:id])
    end
    

    当然你可以添加其他前置过滤器来去除重复代码。

    【讨论】:

      【解决方案2】:

      检查参数。

      如果只是发帖,你只会有:id

      如果是用户/帖子,您将拥有帖子的用户和 ID。

      所以检查params[:user]...

      n.b.如果不是用户,请尝试params[:user_id]

      至于postsindex 方法,我认为这两种情况实际上是相同的。将改变的是它在用户中的使用、关联和范围。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多