القضبان: سمات افتراضية والقيم شكل
-
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>
...
مع ذلك، عندما تكون البيانات النموذج رقم تمرير التحقق من صحة فقدت البيانات 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 = (المدخلات) طريقة للاتصال مرة أخرى بعد بالكرة.