Рельсы:Виртуальные атрибуты и значения формы
-
06-07-2019 - |
Вопрос
У меня есть модель книги с виртуальным атрибутом для создания редактора из формы Книги.Код выглядит следующим образом:
class Book < ActiveRecord::Base
has_many :book_under_tags
has_many :tags, :through => :book_under_tags
has_one :editorial
has_many :written_by
has_many :authors, :through => :written_by
def editorial_string
self.editorial.name unless editorial.nil?
""
end
def editorial_string=(input)
self.editorial = Editorial.find_or_create_by_name(input)
end
end
И новая форма:
<% form_for(@book,
:html => { :multipart => true }) do |f| %>
<%= f.error_messages %>
...
<p>
<%= f.label :editorial_string , "Editorial: " %><br />
<%= f.text_field :editorial_string, :size => 30 %> <span class="eg">Ej. Sudamericana</span>
</p>
...
При этом, когда данные формы не проходят проверку, я потерял данные, введенные в поле редактирования при повторном воспроизведении формы, а также при создании нового редактора.Как я могу исправить эти две проблемы?Я довольно новичок в ruby и не могу найти решение.
ОБНОВИТЕ мой контроллер:
def create
@book = Book.new(params[:book])
respond_to do |format|
if @book.save
flash[:notice] = 'Book was successfully created.'
format.html { redirect_to(@book) }
format.xml { render :xml => @book, :status => :created, :location => @book }
else
format.html { render :action => "new" }
format.xml { render :xml => @book.errors, :status => :unprocessable_entity }
end
end
end
Решение
Я полагаю, это связано с тем, что метод вашей книги #editorial_string всегда будет возвращать "".Можно было бы упростить до следующего:
def editorial_string
editorial ? editorial.name : ""
end
Обновление на основе комментария:
Похоже, вы хотите создавать вложенные формы.(См. accepts_nested_attributes_for в документах api) Обратите внимание, что это новое в Rails 2.3.
Итак, если вы обновите свой класс Book
class Book < ActiveRecord::Base
accepts_nested_attributes_for :editorial
...
end
(Теперь вы также могли бы удалить методы editorial_string=, editorial_string тоже)
И обновите свои формы примерно следующим образом
...
<% f.fields_for :editorial do |editorial_form| %>
<%= editorial_form.label :name, 'Editorial:' %>
<%= editorial_form.text_field :name %>
<% end %>
...
Другие советы
Первая проблема заключается в том, что
def editorial_string
self.editorial.name unless editorial.nil?
""
end
всегда будет возвращать "", потому что это последняя строка.
def editorial_string
return self.editorial.name if editorial
""
end
это решило бы эту проблему.Что касается того, почему проверки не проходят, я не знаю, что вы делаете в контроллере?Какие ошибки проверки вы получаете?
Взгляните на этот подкаст http://railscasts.com/episodes/167-more-on-virtual-attributes.Я думаю, вам следует переместить ваш find_or_create из метода editorial_string=(input) для обратного вызова после сохранения.