У меня есть модель Книги и модель Авторы.рельсы: атрибуты вложенной формы, как избежать создания новых записей в базе данных?
Форма для добавления книг содержит вложенные возможности для добавления авторов. Это работает. Однако у меня есть функция автозаполнения в полях авторов, поэтому, когда форма отправляется в контроллер, автор (почти) наверняка существует в базе данных.
Я должен как-то сделать find_or_initialize_by
на вложенных атрибутах.
Возможно, я смотрю на неправильное место, но я не могу найти это в направляющих. Я попробовал это (нашел на SO):
def create
@book = Book.new(params_book)
small_name = params[:book][:authors_attributes]["0"]["name"].downcase
aut_id = Author.where("\"authors\".\"name\" = :name",{name: small_name}).pluck(:id).join
@book.authors = Author.find_or_initialize_by(id: aut_id)
if @book.save
redirect_to see_book_url(Book.last)
else
render 'new'
end
end
Это создает ошибку:
undefined method `each' for #<Author:0x007fac59c7e1a8>
со ссылкой на линии @book.authors = Author.find_or_initialize_by(id: aut_id)
EDIT
После замечаний по этому вопросу , Я обновил код:
def create
book_params = params_book
small_name = params[:book][:authors_attributes]["0"]["name"].downcase
id = Author.where("\"authors\".\"name\" = :name",{name: small_name}).pluck(:id).join
book_params["authors_attributes"]["0"]["id"] = id
@book = Book.new(book_params)
if @book.save
redirect_to see_book_url(Biblio.last)
else
....
В книге Params выглядеть следующим образом:
<ActionController::Parameters {"title"=>"Testus Testa",
"authors_attributes"=><ActionController::Parameters {
"0"=><ActionController::Parameters {"name"=>"Vabien", "id"=>"22"}
permitted: true>} permitted: true>} permitted: true>
Это выглядит хорошо для меня, но я получаю эту ошибку:
ActiveRecord::RecordNotFound in Administration::BooksController#create
Couldn't find Author with ID=22 for Book with ID=
Рад, что я мог бы помочь! Извините, я не знал, что у вас нет вложенных атрибутов, установленных в вашей модели, иначе я бы это сказал. Однако я все еще немного смущен вашим кодом. Кажется, вы только находите идентификатор первого автора и только первого автора. Кроме того, если у вас есть 2 автора с тем же именем, ваш код не будет работать, что, вероятно, является ошибкой, с которой вы сталкивались раньше. –
Допустим, имя автора просто «bob», и у него есть идентификатор 1. Другой другой также известен как «bob» имеет идентификатор 2. Код 'id = Author.where (" \ "authors \". \ "name \" =: name ", {name: 'bob'}). pluck (: id) .join' возвращает '12', который не является идентификатором какого-либо боба или не может быть идентификатором другого. –
Ознакомьтесь с моим последним ответом –