ruby-on-rails - 用于混合嵌套和非嵌套资源的 Rails Controller

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

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

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

routes.rb 是这样的:

resources :users do
  resources :posts
end

resources:posts

我如何知道帖子 Controller 中是直接访问(/posts)还是通过嵌套路由(/user/:id/posts)访问?

例如,帖子 Controller 的索引方法应该是什么,以便为/users/:id/posts 和/posts 执行正确的 INDEX 操作

有更好的方法吗?

最佳答案

一种解决方案可能是在 Controller 上使用 before 过滤器,例如:

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

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

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

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

关于ruby-on-rails - 用于混合嵌套和非嵌套资源的 Rails Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8870452/

相关文章:

ruby-on-rails - 我如何通过检查代码来判断应用程序是为哪个版本的 Ruby/Rails 编写的?

ruby-on-rails - Rails、范围、OR 和连接

ruby-on-rails - 当为 kvs 使用 redis 时,使用 1 db 或不同的是很快的

mysql - 为多个查询获取 rails ActiveRecord 而不是对象数组

ruby-on-rails - "Couldn' t 找到没有 ID 的 <object>”

sql - 当事件范围超过一个月时按月汇总事件成本(在 rails 3 中)

ruby-on-rails-3 - Rails 3.1 : Engine vs. 可安装的应用程序

ruby-on-rails - 如何调试Rails I18N查找?

ruby-on-rails - 在模型上使用 if 和范围

ruby 1.92 错误的解释器 : permission denied