JSON API:如何确保资源属于current_user?

时间:2017-03-07 01:00:15

标签: ruby-on-rails json json-api

需要一些JSON API结构的帮助。

说我们有以下内容:

class User < ApplicationRecord
 has_many :posts
end

class Post < ApplicationRecord
 has_many :comments
 belongs_to :user
end

class Comment < ApplicationRecord
 belongs_to :post
 has_many :talkbacks
end

class Talkbacks < ApplicationRecord
 belongs_to :comment
end

现在,api点应该类似于以下内容:

/posts
/posts/:id
/posts/:id/comments
/comments
/comments/:id
/comments/:id/talkbacks
/talkbacks
/talkbacks/:id

如果我们想展示帖子,假设我们有一个令牌,那么确保帖子属于当前用户很容易:

# /posts/:id
current_user.posts.find_by_id!(params_id)

但是,如果我们想要显示特定的对讲,那么确保对讲属于用户就更加困难了:

# /talkbacks/:id

确保用户可以访问该对讲的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

你应该用has_one, through关系充实你的关系。然后,它很容易执行查询。您不需要将user_id添加到任务字段(并且不应该因为帖子应该处理该关联)。 has_one关系允许您通过其他模型有效地建立belongs_to关系,并且无需使用连接表。

class User < ApplicationRecord
  has_many :posts
  has_many :comments, through: :posts
  has_many :talkbacks, through: :comments
end

class Post < ApplicationRecord
  belongs_to :user

  has_many :comments
  has_many :tasks, through: :comments
end

class Comment < ApplicationRecord
  belongs_to :post

  has_one :user, through: :post

  has_many :talkbacks
end

class Talkbacks < ApplicationRecord
  belongs_to :comment

  has_one :user, through: :comment
end

然后你可以在你的控制器中做到

current_user.talkbacks.find(params[:id])

在你的帖子中放在一边...

current_user.posts.find_by_id!(params_id)

posts.find_by_id!()相当于posts.find(),因此您不需要执行by_id!部分。默认情况下,如果Rails无法使用find方法查找记录,则会引发异常,与使用find_by_id方法上的爆炸相同。

答案 1 :(得分:1)

您可以尝试这样的事情:

talkback = Talkback.find(params[:id])
if talkback
  if talkback.comment.post.user == current_user
    # do stuff
  else
    # talkback doesn't belong to signed in user
  end
else
  # no talkback exists with that id in the database
end

或者您可以将该逻辑封装在模型中并使用如下方法:

talkbacks_controller.rb

talkback = Talkback.find(params[:id])
if talkback
  if talkback.belongs_to_user?
    # do stuff
  else
    # talkback doesn't belong to signed in user
  end
else
  # no talkback exists with that id in the database
end

talkbalk.rb(模特班)

def belongs_to_user?(user = current_user)
  self.comment.post.user == user
end

如果未指定方法参数,则此方法将当前登录用户用作默认值。

答案 2 :(得分:0)

为什么不将user_id添加到talkbacks表中,然后设置它们之间的关联。我认为这会让你的生活变得更轻松,然后尝试深入嵌套。 (我还会考虑将Talkbacks类的名称更改为单数“Talkback”,以便您坚持使用Rails的命名约定。)

class User < ApplicationRecord
  has_many :posts
  has_many :talkbacks
end

class Talkback
  belongs_to :comment
  belongs_to :user
end

然后你可以打电话:

# /talkbacks/:id
current_user.talkbacks.find_by_id!(params_id)

答案 3 :(得分:0)

你可以用has_many来完成这个:通过。 看看这个post