ruby on rails रेल साधारण_फ़ॉर्म मॉडल से संबंधित नहीं है




ruby-on-rails simple-form (4)

मेरे पास एक मौजूदा फॉर्म है जो 'ऑर्डर' नाम से एक मॉडल से जुड़ा हुआ है, लेकिन मैं नए फॉर्म फ़ील्ड जोड़ना चाहता हूं जो कि क्रेडिट कार्ड की जानकारी जैसे कि नाम, सीसी नंबर, आदि को तृतीय पक्ष भुगतान गेटवे पर संसाधित किया जाएगा।

लेकिन जब से मैं हमारे डेटाबेस में सीसी जानकारी को नहीं सहेजना चाहता हूं, मेरे ऑर्डर तालिका में कोई संबंधित कॉलम नहीं हैं। और यह मुझे एक त्रुटि देता है जब फॉर्म जमा करते हुए ये क्रेडिट कार्ड इनपुट फ़ील्ड ऑर्डर मॉडल के 'भाग' नहीं हैं।


इसके अलावा अगर आप कुछ जोड़ना और उसे params में लाने की कोशिश कर रहे हैं, लेकिन मॉडल के हैश से बाहर निकलते हैं, तो आप केवल फॉर्मटेगहेल्पर कर सकते हैं। http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

उदाहरण:

    <%= simple_form_for resource, :as => resource_name, :url =>   invitation_path(resource_name), :html => {:method => :post} do |f| %>
       <%= devise_error_messages! %>

    <% resource.class.invite_key_fields.each do |field| -%>
       <%= f.input field %>
       <%= hidden_field_tag :object_name, @object.class.name %>
       <%= hidden_field_tag :object_id, @object.id %>
    <% end -%>

इसे संभालने का सबसे अच्छा तरीका यह है कि आप इसे simple_fields_for का उपयोग करें:

<%= simple_form_for @user do |f| %>
  <%= f.input :first_name %>
  <%= f.input :last_name %>
  <%= f.input :email %>

  <%= simple_fields_for :other do |o| %>
    <%= o.input :change_password, as: :boolean, label: 'I want to change my password' %>
  <% end %>
<% end %>

इस उदाहरण में, मैंने change_password नामक एक नया क्षेत्र जोड़ा है जो अंतर्निहित user मॉडल का हिस्सा नहीं है।

यह एक अच्छा तरीका है, इसका कारण यह है कि यह आपको किसी भी साधारण फ़ॉर्म इनपुट / रैपर को खेतों के रूप में उपयोग करने देता है। मैं @ बैक्स द्वारा जवाब की परवाह नहीं करता, क्योंकि यह आपको विभिन्न प्रकार के इनपुट का उपयोग करने की अनुमति नहीं देता है यह अधिक लचीला लगता है

यद्यपि इसके लिए काम करने के लिए नोटिस, मुझे पास करना पड़ा :other लिए simple_fields_for आप किसी भी स्ट्रिंग / प्रतीक पारित कर सकते हैं, जब तक कि उस नाम के साथ कोई मॉडल न हो

Ie दुर्भाग्य से मैं पास नहीं कर सकता :user , के रूप में simple_form एक उपयोगकर्ता मॉडल instantiate की कोशिश करेंगे, और हम एक ही त्रुटि संदेश फिर से मिल जाएगा ...


अगर मैं आपके उत्तर को सही ढंग से समझता हूं, तो आप इसे आधिकारिक विकी पृष्ठ में समझाया है: एक नकली इनपुट बनाएं जो विशेषताओं को नहीं पढ़ता है । आप एडवर्ड के सुझाव से किसी भी वास्तविक डेटाबेस कॉलम से संबंधित क्षेत्र का उपयोग नहीं कर सकते हैं, लेकिन यदि आपके मॉडल में फ़ॉर्म फ़ील्ड का कोई संबंध नहीं है, तो आपको अपने मॉडल में एक विशेषता को परिभाषित करने की आवश्यकता नहीं है।

संक्षेप में, इस पृष्ठ में समझाया जाने वाला ट्रिक 'FakeInput' नामक एक कस्टम इनपुट को परिभाषित करता है और इसे इस तरह प्रयोग करता है:

<%= simple_form_for @user do |f| %>
  <%= f.input :agreement, as: :fake %>
  ....

फिटर मैन के रूप में एक कस्टम इनपुट जोड़ने / संशोधित करने के बाद अपने रेल सर्वर को पुनः आरंभ करने के लिए मत भूलना।

अद्यतन करें: कृपया ध्यान दें कि आधिकारिक विकी पृष्ठ ने अपडेट किया है और विकी पृष्ठ पर नमूना कोड उन लोगों के लिए काम नहीं कर रहा है, जो साधारणफॉर्म के पुराने संस्करणों का उपयोग करते हैं। इसके बजाय नीचे दिए गए कोड का उपयोग करें यदि आप के undefined method merge_wrapper_options for... जैसे त्रुटि undefined method merge_wrapper_options for... मैं 3.0.1 का उपयोग कर रहा हूं और यह कोड अच्छी तरह से काम करता है

class FakeInput < SimpleForm::Inputs::StringInput
  # This method only create a basic input without reading any value from object
  def input
    template.text_field_tag(attribute_name, input_options.delete(:value), input_html_options)
  end
end

आप attr_accessor का उपयोग कर सकते हैं

 class Order < ActiveRecord::Base

   attr_accessor :card_number


 end

अब आप Order.first.card_number = '54421542122' कर सकते हैं या इसे अपने फॉर्म में या जो कुछ भी करने की आवश्यकता है उसका उपयोग कर सकते हैं।

रूबी डॉक्स के लिए यहां देखें http://www.ruby-doc.org/core-1.9.3/Module.html#method-i-attr_accessor और यहां एक उपयोगी स्टैक ओवरफ्लो प्रश्न के लिए रूबी में attr_accessor क्या है?

इसे attr_accessible के साथ मिश्रित मत करो! Attr_accessor और attr_accessible के बीच का अंतर





simple-form