Как добавить current_user в user_id для form_for в rails?

У меня есть форма для создания материалов (название, описание и контент - все основные). Форма сохраняет эти данные просто отлично, но не сохраняет user_id, который должен быть user_id текущего_user. Как мне это сделать? Это должно быть легко, но до сих пор ничего не было сделано.

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

Ответ 1

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

Ответ 2

Существует несколько способов сделать это в зависимости от того, как у вас установлена ​​ваша программа. Если между пользователем и материалами существует связь (у Пользователя есть много материалов), вы можете использовать это в своем контроллере:

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

Если у вас нет этих отношений, я бы порекомендовал установить его в контроллере, а не скрытое поле в форме. Это будет более безопасно, потому что это не позволит кому-то изменить значение идентификатора пользователя:

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

Ответ 3

Предполагая, что вы сохраняете объект пользователей входа в current_user, следующий будет работать для вас

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

Ответ 4

С 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 #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

Heads up: Установка (или перезапись!) params[:discussion][:comments_attributes]["0"][:user_id] что будет params[:discussion][:comments_attributes]["0"][:user_id] отлично работает для создания. Но если вы разрешаете редактировать глубокие иерархии в дополнение к созданию, убедитесь, что вы случайно не перезаписали все :user_id с текущим пользователем.