0

我正在学习 Rails,我只是想知道我编写的某些代码是否正确且安全。我有两个模型,一个用户模型和一个帖子模型。帖子属于用户,所以我想在创建对象时自动传递 user_id 来发布。我在 post 控制器中使用了一个 assign_attributes 方法,使用 devise 提供的 current_user 帮助器来设置 user_id。下面是我的相关代码。我再次想知道这是否正确,或者是否有更好的方法。

def create
@post = Post.new(params[:post])
@post.assign_attributes({:user_id => current_user.id})

end

后模型

class Post < ActiveRecord::Base

attr_accessible :content, :title, :user_id

validates :content, :title, :presence => true

belongs_to :user

end

用户模型

class User < ActiveRecord::Base

devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

# Setup accessible (or protected) attributes for your model
attr_accessible :email, :password, :password_confirmation, :remember_me


has_many :posts

end
4

3 回答 3

2

你很接近。由于您已经 1) 获得了current_userDevise 提供的便利助手,并且 2) 配置UserPost/has_many关系belongs_to,因此创建新帖子,然后将其附加到current_user. 然后,在您的Post模型中,您需要分解对单个属性的验证——您:content, :title按顺序列出的方式行不通。

# app/controllers/posts_controller.rb
def create
    post = Post.create(params[:post])
    current_user.posts << post
end

# app/models/post.rb
class Post < ActiveRecord::Base

    attr_accessible :content, :title, :user_id

    validates :content, :presence => true
    validates :title, :presence => true

    belongs_to :user
end
于 2013-06-07T00:52:05.920 回答
0

我会说这样的话:

def create
    params[:post][:user_id] = current_user.id
    @post = Post.new(params[:post])
    @post.save
end

或者

def create
  @post = Post.new(params[:post])
  @post.user = current_user
  if @post.save
  ...
  else
  ...
  end
end

或者

def create
  @post = @post.new(params[:post])
  @post.user_id = current_user.id
  @post.save
end

您可以将 user_id 放在参数中,但这并不安全。user_id 不应位于“attr_accessable”中,因此它将受到 mass_assignment 的保护。

于 2013-06-07T04:24:47.233 回答
0

我认为这没有必要,因为您已经创建了帖子和用户之间的关系。如果您将帖子资源嵌套到用户中,它将自动创建两个模型之间的关系。

在路线.rb

resources :users do
  resources :posts
end

完成后,您现在将引用帖子作为@user.post。我已经在这个问题中展示了一个例子。

于 2013-06-07T00:53:40.443 回答