Rails: виртуальные атрибуты и значения форм - PullRequest
5 голосов
/ 21 июня 2009

У меня есть книга моделей с виртуальным атрибутом для создания редактора из формы книги. Код выглядит так:

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

Ответы [ 3 ]

4 голосов
/ 21 июня 2009

Я полагаю, что причина в том, что ваш метод Book # editorial_string всегда будет возвращать "". Можно упростить до следующего:

  def editorial_string
   editorial ? editorial.name : ""
  end

Обновление на основе комментария:

Звучит так, будто вы хотите делать вложенные формы. (См. acceptpts_nested_attributes_for в документации API ). Обратите внимание, это новое в Rails 2.3.

Итак, если вы обновите свой класс Книги

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 %>
...
1 голос
/ 21 июня 2009

Первая проблема в том, что

def editorial_string
  self.editorial.name unless editorial.nil?
  ""
end

всегда будет возвращать "", потому что это последняя строка.

def editorial_string
  return self.editorial.name if editorial
  ""
end

исправит эту проблему. Почему проверки не проходят, я не знаю, что ты делаешь в контроллере? Какие ошибки проверки вы получаете?

0 голосов
/ 26 июня 2009

Взгляните на этот подкаст http://railscasts.com/episodes/167-more-on-virtual-attributes. Я думаю, вам следует переместить ваш find_or_create из editorial_string = (вход) метод для обратного вызова после сохранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...