كيف يمكنني جعل form.select العودة نموذجا في القضبان؟

StackOverflow https://stackoverflow.com/questions/818119

  •  03-07-2019
  •  | 
  •  

سؤال

ولدي نموذج يسمى الاتصال التي has_one الضيافة مثل ذلك.

class Contact < ActiveRecord::Base
  has_one :guest, :class_name => "Contact", :foreign_key => "guest"
end

في بلدي خلق رأي أنا باستخدام أسلوب مساعد حدد لسرد كافة جهات الاتصال التي يمكن اختيارها كضيف مثل ذلك ...

<% form_for(@contact) do |f| %>
  <%= f.error_messages %>
    ...
    <p>
        <%= f.label :guest %><br />
        <% @guests = Contact.find(:all, :order => "lastname").map { |u| [u.lastname + ', ' + u.firstname, u.id] } %>
        <%= f.select :guest, @guests, {:include_blank => true} %>
    </p>
    ...
<% end %>

ومتى يقدم هذا النموذج أحصل على خطأ قائلا انها تتوقع الاتصال ولكن حصلت سلسلة.

وأين وكيف ينبغي أن تحويل السلسلة المقدمة من النموذج إلى الاتصال قبل أن حفظ جهة الاتصال الحالي إلى قاعدة البيانات؟

هل كانت مفيدة؟

المحلول

وعند إنشاء الجمعية في القضبان، مثل has_one، وهناك بعض الأساليب التي وديناميكيا لكائن للحصول على مهمة سهلة.

والآن، الأسلوب الذي تستخدمه

@contact.guest = @guest

والكائن الاتصال الخاصة بك تتوقع الحصول على كائن أكتيفيريكورد آخر أنه قد يؤيد. ما كنت تحاول أن تفعل ذلك، هو نوع "وهمية" هذا الأسلوب في النموذج الخاص بك التي يلتف كائن نموذج. (يتم جلب المعلومات القادمة من الناحية بارامس في كسلسلة، وهذا هو السبب كنت تحصل على هذا الخطأ)

وهناك العديد من الطرق التي يمكن أن تذهب نحو تنفيذ هذا. الأول مع تستخدم سمات نموذج المتداخلة. . . أشكال المعقدة التي تسمح لك لالتفاف جمعية الطفل داخل form_for كنت تستخدم (باستخدام fields_for شكل المساعد). ومن شأن تفسير هذا يستغرق وقتا طويلا لكتابة ما يصل، ولحسن الحظ هناك موارد حرة لا يصدق على أشكال معقدة:

Railscasts أشكال مجمع جزء 1

Railscasts أشكال مجمع جزء 2

Railscasts أشكال مجمع جزء 3

وأيضا، إذا كنت تستخدم القضبان 2.3 ثم تحقق من بعض المعلومات عن "accepts_nested_attributes_for". . . هناك نقص واضح في الدروس الآن هناك حق، ولكن أتصور مع الافراج عن 2.3 هناك سوف يكون الكثير المقبلة. هذا المساعد مفيد قليلا سوف قطع ما يقرب من نصف رمز يستخدم ريان في شاشته يلقي لجعل أشكال تقبل نموذج subbordinate.

وأخيرا هناك حلا. إذا علاقتك بسيطة، إذا كان الضيوف تريد أن تقترن بالفعل في قاعدة البيانات، والتي لا تحتاج إلى إنشاء مؤسسات جديدة من النموذج الذي تستخدمه، ثم يمكنك استخدام شيء من هذا القبيل سمة افتراضية. في النموذج الخاص بك، ببساطة تغيير f.select :guest لشيء من هذا القبيل f.select :guest_select وتنفيذ أسلوب في النموذج الخاص بك:

def guest_select=(incoming_id_from_form)
  contact = Contact.find(incoming_id_from_form)
  self.guest = contact
end

والتي سوف تعيين نموذج أكتيفيريكورد دون الحاجة إلى تنفيذ شكل معقد للقيام بذلك نيابة عنك!

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