5

我有一个带有虚拟属性的模型书,用于从 Book 表单创建一个编辑器。代码如下所示:

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>
 ...

有了这个,当表单数据没有通过验证时,当表单重新显示时,我丢失了在编辑字段中提交的数据,并且还创建了一个新的编辑器。我该如何解决这两个问题?我对红宝石很陌生,我找不到解决方案。

更新我的控制器:

  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
4

3 回答 3

4

我相信它的原因是您的 Book#editorial_string 方法将始终返回“”。可以简化为以下内容:

  def editorial_string
   editorial ? editorial.name : ""
  end

根据评论更新:

听起来你想做嵌套表单。(请参阅api docs 中的accepts_nested_attributes_for)注意这是 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 %>
...
于 2009-06-21T02:11:19.070 回答
2

第一个问题是

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

将始终返回 "" 因为那是最后一行。

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

会解决这个问题。至于为什么验证不通过,我不知道,你在控制器中做什么?你得到什么验证错误?

于 2009-06-21T02:07:32.700 回答
0

看看这个播客http://railscasts.com/episodes/167-more-on-virtual-attributes。我认为您应该将 find_or_create 从 editorial_string=(input) 方法移动到保存后回调。

于 2009-06-25T20:42:48.910 回答