2015-06-12 11 views
6

पर चेकबॉक्स परिणाम सहेजें मेरे पास मॉडल channel कॉलम के साथ है। यह channel चेकबॉक्स के माध्यम से चुने गए परिणामों की serialized सरणी संग्रहीत करेगा।रेल 4: सीरियलकृत ऐरे

यहाँ मॉडल ..

एप्लिकेशन/मॉडल/campaign.rb

class Campaign < ActiveRecord::Base 
    serialize :channels, Array 
end 

एप्लिकेशन/नियंत्रक/compaigns_controller.rb

class CampaignsController < ApplicationController 
     def index 
     @campaigns = Campaign.all.order("created_at DESC") 
     end 

     def new 
     @campaign = Campaign.new 
     end 

     def create 
     @campaign = Campaign.new(campaign_params) 


     if @campaign.save 

      zip = Uploadzip.find(params[:uploadzip_id]) 
      zip.campaign = @campaign 
      zip.save 

      flash[:success] = "Campaign Successfully Launched!" 
      redirect_to @campaign 
     else 
      flash[:error] = "There was a problem launching your Campaign." 
      redirect_to new_campaign_path 
     end 
     end 

     def show 
     @campaign = Campaign.includes(:program, :uploadzip, :channel, :plan, :uploadpdfs).find(params[:id]) 
     end 

    private 

     def campaign_params 
     params.require(:campaign).permit(:name, :comment, :channel, :plan_id, :program_id, :campaign_id, uploadpdf_ids: []) 
     end 
end 

प्रपत्र का हिस्सा है चेकबॉक्स के साथ ..

विचारों/अभियान/_target.rb

<%= form_for @campaign, url: {action: "create"} do |f| %> 

    ... 

<label class="right-inline"> 
    <%= f.label :channel, "Distribution Channel", class: "right-label" %> 
</label> 

<ul class="channel-list"> 
    <% ["Folder", "Fax", "Email"].each do |channel| %> 

    <li><%= check_box_tag :channel, channel %> <%= channel %> 
     <% end %></li> 
</ul> 

... 

<% end %> 

मैं अभियान ऑब्जेक्ट के अंदर इन परिणामों बचत समस्याएं आ रही हैं।

किसी भी मदद की अत्यधिक सराहना की जाती है।

+1

पहले मुझे लगता है कि आप 'प्रत्येक' लूप गलत है। प्रत्येक पाश में आप '

  • ' बनाते हैं और आपके पास लूप से केवल एक '
  • ' है। – inye

    उत्तर

    19

    सबसे पहले, आपने बताया कि कॉलम का नाम channel है, लेकिन आपने Campaign मॉडल में इसका बहुवचन संस्करण उपयोग किया है। चूंकि आप इस कॉलम में चैनलों की सरणी को सहेजने की योजना बना रहे हैं, इसलिए मैं सुझाव दूंगा कि आप डेटाबेस में कॉलम का नाम channels पर बदलें। नीचे दिया गया सभी कोड मानता है कि आप डेटाबेस कॉलम को channels में बदल देंगे।

    आप एक Array और अपने फार्म के लिए channels विशेषता serializing कर रहे हैं के बाद से नियंत्रक करने के लिए एक सरणी के रूप में उस पैरामीटर भेज देंगे, तो आप उसके अनुसार अपनी campaign_params विधि को अपडेट करने की आवश्यकता होगी।

    def campaign_params 
        params.require(:campaign).permit(:name, :comment, :plan_id, :program_id, :campaign_id, uploadpdf_ids: [], channels: []) 
    end 
    

    अब, अपने @campaign फार्म की प्रासंगिकता का इस तरह दिखना चाहिए:

    <ul class="channels-list"> 
        <% ["Folder", "Fax", "Email"].each do |channel| %> 
        <li><%= check_box_tag "campaign[channels][]", channel, @campaign.channels.include?(channel), id: "campaign_channels_#{channel}" %> <%= channel %></li> 
        <% end %> 
    </ul> 
    

    स्पष्टीकरण

    में प्रथम तर्क टैग की name विशेषता है। दूसरा value विशेषता है। तीसरा बूलियन वैल्यू यह बताने के लिए है कि चेकबॉक्स चेक किया जाएगा या नहीं जब प्रारंभ में प्रस्तुत किया गया था। वर्तमान चयन दिखाने के लिए यह edit फ़ॉर्म में सहायक होगा।

    ध्यान दें कि मैं स्पष्ट रूप से id विशेषता प्रदान कर रहा हूं। अगर हम ऐसा नहीं करते हैं, तो सभी तीन चेकबॉक्स में एक ही आईडी होगी (उनके नाम से व्युत्पन्न), जो वैध HTML नहीं होगा क्योंकि आईडी को दोहराया नहीं जाना चाहिए।

    जनरेट किया गया एचटीएमएल इस तरह दिखना चाहिए:

    <li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Folder" value="Folder" /> Folder</li> 
    <li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Fax" value="Fax" /> Fax</li> 
    <li><input type="checkbox" name="campaign[channels][]" id="campaign_channels_Email" value="Email" /> Email</li> 
    

    controller चुने गए मानों की एक सरणी के रूप में channels परम देखेंगे।

    यह दोनों नए और संपादन रूपों के लिए काम करना चाहिए।

    +0

    यह काम करता है! महान प्रतिक्रिया के लिए धन्यवाद। समझने के लिए बहुत गहन और आसान है। वास्तव में मुझे क्या चाहिए। – shroy

    +2

    शब्द, समाधान कोड, कोड की व्याख्या। विनम्र भी। क्या आप कृपया अधिक कर सकते हैं। 0 / – Jetblackstar