Ruby on rails 如何将当前用户添加到用户id以形成rails中的用户?

Ruby on rails 如何将当前用户添加到用户id以形成rails中的用户?,ruby-on-rails,form-for,Ruby On Rails,Form For,我有一个创建材料的表单(标题、描述和内容-所有基本内容)。表单可以很好地保存这些详细信息,但不保存用户id,该id应该是当前用户的用户id。我该怎么做?这一定很容易,但到目前为止还没有任何效果 def create @material = Material.new(params[:material]) if @material.save flash[:success] = "Content Successfully Created" redirect_to @m

我有一个创建材料的表单(标题、描述和内容-所有基本内容)。表单可以很好地保存这些详细信息,但不保存用户id,该id应该是当前用户的用户id。我该怎么做?这一定很容易,但到目前为止还没有任何效果

def create 
   @material = Material.new(params[:material])
   if @material.save
     flash[:success] = "Content Successfully Created"
     redirect_to @material
   else
     render 'new'
   end
end

假设您将登录用户的对象保存在
当前用户
中,以下内容适用于您

   @material = Material.new(params[:material])
   @material.user_id = current_user.id
   if @material.save

根据应用程序的设置方式,有几种不同的方法。如果用户和材质之间存在关系(用户有许多材质),则可以在控制器中使用该关系:

def create
  @material = current_user.materials.new(params[:material])
  # ...
end
如果您没有这种关系,我仍然建议在控制器中设置它,而不是在表单中设置一个隐藏字段。这将更加安全,因为它不会让任何人篡改用户id值:

def create
  @material = Material.new(params[:material].merge(user_id: current_user))
  # ...
end

由于Rails 5和参数需要在创建对象之前进行
permit
ted,因此这是将
当前用户
合并到参数中的最简单方法,值得@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
如果使用
创建嵌套对象时接受
的_嵌套属性_,则需要手动深入合并到关联参数中:

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
class用户

注意:设置(或覆盖!)将要设置的
参数[:discussion][:comments\u attributes][“0”][:user\u id]
可以很好地创建。但是,如果除了创建之外还允许编辑深层层次结构,请确保不会意外地用当前用户覆盖所有的
:user\u id

是的,我一直在考虑设置关联。我犹豫了一下,因为虽然一个用户确实创建了材质,但可能会有一段时间几个用户创建了材质,而我还不想处理这个问题。谢谢你!
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