rails控制器,用于混合嵌套和非嵌套资源

时间:2012-01-15 14:33:00

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

我正在开发类似应用的博客, 我的用户模块has_many帖子和帖子模块belongs_to用户

我想访问两个用户/:id / posts和posts /

routes.rb是这样的:

resources :users do
  resources :posts
end

resources:posts

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

例如,对于/ users /:id / posts和/ posts

执行正确的INDEX操作的posts控制器的索引方法应该是什么

有更好的方法吗?

2 个答案:

答案 0 :(得分:7)

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

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

当然,您可以添加其他过滤器以删除重复的代码。

答案 1 :(得分:1)

检查参数。

如果发布您只需:id

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

因此,请检查params[:user] ...

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

对于index的{​​{1}}方法,我认为在两种情况下它实际上都是相同的。改变的是它在用户中的使用,关联和范围。