سؤال

ولدي كتاب نموذج مع سمة افتراضية لإنشاء محرر من شكل كتاب. رمز يشبه:

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

مع ذلك، عندما تكون البيانات النموذج رقم تمرير التحقق من صحة فقدت البيانات submited في مجال التحرير عندما يتم إعادة عرض النموذج، وكذلك يتم إنشاء محرر جديد. كيف يمكن إصلاح هذا مشكلتين؟ أنا جميلة جديدة في روبي، وأنا لا يمكن ايجاد حل.

وUPDATE تحكم بلدي:

  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 في المعهد مستندات ) لاحظ هذا هو الجديد في درابزون 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 %>
...

نصائح أخرى

والمشكلة الأولى هي أن

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

وسيعود دائما "" لأن ذلك هو السطر الأخير.

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

وسوف إصلاح هذه المشكلة. بقدر ما السبب في أن التصديقات لا يمر، وأنا لا أعرف، ماذا تفعلين في وحدة تحكم؟ أخطاء ما التحقق من صحة أنك تحصل؟

ونلقي نظرة على هذا podcast http://railscasts.com/episodes / 167-أكثر على اساس الظاهري-سمات . أعتقد أنك يجب أن تتحرك find_or_create بك من editorial_string = (المدخلات)  طريقة للاتصال مرة أخرى بعد بالكرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top