Rails - 在嵌套资源上使用Devise current_user,无需使用user_id直接访问模型

时间:2013-08-25 13:01:31

标签: ruby-on-rails devise ruby-on-rails-4

我正在创建一个rails 4应用程序,用户可以在其中创建项目并向项目添加帖子。帖子将包含文字和带可选字幕的图片,因此我有一个照片模型可存储图片及其字幕。

用户有很多项目,项目有很多帖子,帖子有很多照片

我的路线看起来像这样:

resources :projects do
  resources :posts
end
resources :posts do
  resources :photos
end

current_user授权适用于项目和帖子,因为帖子与其中存储了user_id的项目直接相关。照片只能直接链接到帖子,所以我不能像在帖子控制器中那样做:

def set_project
  @project = current_user.projects.find(params[:project_id])
end

是否有办法以类似的方式在照片上使用current_user,以便只有项目的作者可以添加,编辑,删除照片到他们的帖子?

目前在我的照片控制器中,我通过以下方式获得相关帖子:

def set_post
  @post = Post.find(params[:post_id])
end

但显然没有current_user授权。我需要一些方法来找到帖子所属项目的ID,然后在照片控制器内使用current_user。

1 个答案:

答案 0 :(得分:0)

经验法则是不要有两级以上的嵌套资源,否则你会太忙而无法照顾它们(忘记来源,也许是根据我的经验

对于您的情况,我建议不要为照片设置嵌套资源。(或者将其设置为嵌套在用户下)

resources project do
  resources posts
end

resources photo

然后模型

class User < ActiveRecord::Base
  has_many :photos
  has_many :projects
end

这在现实世界中也很有意义。一个帖子属于一个项目,这是合理的。但照片怎么样?如果你有一张照片在一个帖子中显示你的布局想法,未来的帖子可以再次使用这张照片吗?说客户想要比较之前和之后?绝对应该。因此,照片在合理逻辑上更好地独立于帖子。

然后,你现在所有的问题都不是问题。

添加:回答评论中的问题 在我看来,有三种方法可以将帖子与照片联系起来(不是关联):

  1. 在帖子内容中插入照片ID,这是最受欢迎的,通过这种方式,作者可以控制照片的位置。无需关联。

  2. 很多关系。有点复杂。

  3. 在帖子中使用序列化列来存储它提到的照片ID数组。

  4. 另一种方式是你的方法,发布has_many照片。在这种情况下,照片将具有FIXED post_id,并且无法在其他帖子中调用。如果结果可以接受,您可以这样做。但即使这样,您也不需要嵌套资源。