13

我有一个用于创建材料的表格(标题、描述和内容 - 都是基本的)。表单很好地保存了这些详细信息,但它没有保存 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
4

4 回答 4

13
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
于 2012-10-06T12:19:36.590 回答
5

根据您的应用程序设置方式,有几种不同的方法可以做到这一点。如果用户和材料之间存在关系(用户有很多材料),您可以在控制器中使用它:

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

如果您没有这种关系,我仍然建议将其设置在控制器中,而不是表单中的隐藏字段。这将更安全,因为它不会让任何人篡改用户 id 值:

def create
  @material = Material.new(params[:material].merge(user_id: current_user))
  # ...
end
于 2012-10-06T12:19:26.657 回答
2

假设您在下面保存登录用户的对象current_user将适用于您

   @material = Material.new(params[:material])
   @material.user_id = current_user.id
   if @material.save
于 2012-10-06T12:19:03.440 回答
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]适合创建。但是,如果您允许编辑创建之外的深层层次结构,请确保您不会意外覆盖:user_id当前用户的所有 s。

于 2019-03-27T17:14:41.497 回答