我正在学习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
答案 0 :(得分:2)
你非常接近。由于您已经1)被Devise提供了current_user
便利助手,并且2)已将User
和Post
配置为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
答案 1 :(得分:0)
我认为没有必要,因为您已经创建了帖子和用户之间的关系。如果将帖子资源嵌套到用户中,它将自动创建2个模型之间的关系。
在routes.rb
中resources :users do
resources :posts
end
完成后,您现在将帖子引用为@ user.post。我已在this question中展示了一个示例。
答案 2 :(得分: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的保护。