Ответ 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
У меня есть форма для создания материалов (название, описание и контент - все основные). Форма сохраняет эти данные просто отлично, но не сохраняет 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
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
Существует несколько способов сделать это в зависимости от того, как у вас установлена ваша программа. Если между пользователем и материалами существует связь (у Пользователя есть много материалов), вы можете использовать это в своем контроллере:
def create
@material = current_user.materials.new(params[:material])
# ...
end
Если у вас нет этих отношений, я бы порекомендовал установить его в контроллере, а не скрытое поле в форме. Это будет более безопасно, потому что это не позволит кому-то изменить значение идентификатора пользователя:
def create
@material = Material.new(params[:material].merge(user_id: current_user))
# ...
end
Предполагая, что вы сохраняете объект пользователей входа в current_user
, следующий будет работать для вас
@material = Material.new(params[:material])
@material.user_id = current_user.id
if @material.save
С 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
с текущим пользователем.