У меня есть две модели - пользователи и ключевые слова и третьи ассоциации моделей, которые соединяют пользователей и ключевые слова с отношениями has_many.Сохранение записей с has_many через отношения
У меня есть создать метод в контроллере ключевых слов, который показан ниже -
def create
@keyword = Keyword.new(keyword_params)
if Keyword.find_by(content: params[:content]).nil?
@keyword.save
end
@keyword.associations.create(:user_id => current_user.id)
flash[:success] = "Keyword successfully created!"
redirect_to keywords_path
В методе «создать», упомянутую выше, после того, как пользователь добавляет ключевое слово, я проверяю, если это ключевое слово уже существует в таблицы ключевых слов, и если это не так, это сохраняет ключевое слово в таблице ключевых слов, а затем сохраняет связь между пользователем и ключевым словом в таблице ассоциаций.
Однако, когда ключевое слово уже существует в таблице ключевых слов (поскольку оно могло быть добавлено другим пользователем), и позволяет сказать, что новый пользователь добавляет это существующее ключевое слово в свой список, это дает мне ошибку - «You не может вызвать create, если родитель не будет сохранен "в строке @ keyword.associations.create, поскольку @ keyword.save пропускается (поскольку ключевое слово уже существует в базе данных).
Я использую Rails 4 и рубин 2.0.0
Я новичок в Rails и был бы признателен за любую помощь вы, ребята, можете предоставить.
Update: Добавление деталей ключевых слов модели и ключевые слова контроллера
модели: модель Пользователь:
class User < ActiveRecord::Base
before_save { self.email = email.downcase }
before_create :create_remember_token
has_many :associations
has_many :keywords, :through => :associations
#name
validates :name, presence: true, length: { maximum: 50 }
end
модель Ключевое слово:
class Keyword < ActiveRecord::Base
has_many :questions
has_many :associations
has_many :users, :through => :associations
validates :content, presence: true, uniqueness: { case_sensitive: false }
end
ассоциации модель
class Association < ActiveRecord::Base
belongs_to :keyword
belongs_to :user
validates :user_id, :uniqueness => { :scope => :keyword_id }
end
Ключевые слова Контроллер:
class KeywordsController < ApplicationController
before_action :signed_in_user, only: [:index, :edit, :update, :destroy]
def index
@keywords = current_user.keywords.to_a
end
def new
@keyword = Keyword.new
end
def create
@keyword = Keyword.find_by(content: params[:content])
if @keyword.nil?
@keyword = Keyword.create(keyword_params)
end
@keyword.associations.create(:user_id => current_user.id)
flash[:success] = "Keyword successfully created!"
redirect_to keywords_path
end
def destroy
end
private
def keyword_params
params.require(:keyword).permit(:content)
end
end
Спасибо Виталию за ваш быстрый ответ.К сожалению, ваши предложенные изменения дают ту же ошибку: «Вы не можете вызвать create, если родитель не сохранен» – amey1908
это может быть потому, что у родителя есть некоторые ошибки проверки, это поможет, если вы вставили содержимое класса Keyword –
Hi Vitaliy, я добавил код для модели ключевых слов и контроллер в моем исходном вопросе. Пожалуйста, дайте мне знать, есть ли какие-либо проблемы с моей проверкой. Спасибо за вашу помощь. – amey1908