我有一个用于创建材料的表单(标题,描述和内容 - 所有基础)。表单保存这些细节很好,但它不保存user_id,user_id应该是current_user的user_id。我该怎么做呢?这一定很容易,但到目前为止还没有任何工作。
def create
@material = Material.new(params[:material])
if @material.save
flash[:success] = "Content Successfully Created"
redirect_to @material
else
render 'new'
end
end
答案 0 :(得分:11)
def create
@material = Material.new(params[:material])
@material.user_id = current_user.id if current_user
if @material.save
flash[:success] = "Content Successfully Created"
redirect_to @material
else
render 'new'
end
end
答案 1 :(得分:4)
根据您的应用程序设置方式,有几种不同的方法可以执行此操作。如果用户和材料之间存在关系(用户有许多材料),您可以在控制器中使用它:
def create
@material = current_user.materials.new(params[:material])
# ...
end
如果你没有这种关系,我仍然建议在控制器中设置它而不是表单中的隐藏字段。这样会更安全,因为它不会让某人篡改用户ID值:
def create
@material = Material.new(params[:material].merge(user_id: current_user))
# ...
end
答案 2 :(得分:2)
假设您正在保存登录用户的current_user
以下对象将对您有效
@material = Material.new(params[:material])
@material.user_id = current_user.id
if @material.save
答案 3 :(得分:0)
在创建对象之前需要对Rails 5和参数进行permit
设置,这是将current_user
合并为参数的最简单方法,对@Peter Brown的回答表示敬意:>
def create
@discussion = current_user.materials.new(new_material_params)
# ...
end
private
def new_material_params
params.require(:material).permit(:title, :description,: content)
end
如果使用accepts_nested_attributes_for
创建了嵌套对象,则需要手动将其深深地合并到关联参数中:
class User < ApplicationRecord
has_many :discussions # Used to associate User with Discussion later
end
class Comment < ApplicationRecord
belongs_to :user
end
class Discussion < ApplicationRecord
belongs_to :user
has_many :comments
accepts_nested_attributes_for :comments
end
class DiscussionsController < ApplicationController
def create
# Merge the params[:discussion][:user_id] by using the relationship's #new
@discussion = current_user.discussion.new(new_discussion_params)
end
private
# Sanitized params for creation, not editing
def new_discussion_params
params.require(:discussion)
.permit(:title, :user_id,
comments_attributes: [:id, :content, :discussion_id, :user_id])
.tap do |discussion_params|
# Require the association parameters, and if they exist,
# set :user_id for each.
discussion_params.require(:comments_attributes).each do |i, comment|
comment.merge!(user_id: current_user.id)
end
end
end
end
注意::设置(或覆盖!)将是params[:discussion][:comments_attributes]["0"][:user_id]
的方法可以很好地进行创建。但是,如果除了 creation 之外还允许 editing 深层次结构,请确保不要意外覆盖当前用户的所有:user_id
。