2015-06-12 5 views
6

Ich habe eine Campaign Modell mit einer channel Spalte. Diese channel speichert ein serialized Array von ausgewählten Ergebnissen über Kontrollkästchen.Schienen 4: Kontrollkästchen-Ergebnisse zu serialisierten Array speichern

Hier ist das Modell ..

app/models/campaign.rb

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

app/controllers/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 

Der Teil des Formulars mit Checkboxen ..

views/Kampagnen/_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 %> 

Ich habe Probleme, diese Ergebnisse in der Kampagne Objekt zu speichern.

Jede Hilfe wird sehr geschätzt.

+1

zuerst ich glaube, Sie 'each' Schleife falsch ist. In jeder Schleife erstellen Sie eine '

  • ' und Sie haben nur eine'
  • ' aus der Schleife. – inye

    Antwort

    19

    Zuerst erwähnten Sie, dass der Spaltenname channel ist, aber Sie haben seine Pluralversion in Campaign Modell verwendet. Da Sie beabsichtigen, ein Array von Kanälen in dieser Spalte zu speichern, würde ich vorschlagen, dass Sie den Namen der Spalte in der Datenbank in channels ändern. Der gesamte folgende Code geht davon aus, dass Sie die Datenbankspalte in channels ändern werden.

    Da Sie das channels Attribut zu einer Array und Ihre Form sind serialisiert werden, dass der Parameter als ein Array an den Controller senden, müssen Sie Ihre campaign_params Methode entsprechend aktualisieren.

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

    nun der relevante Teil Ihrer @campaign Form sollte wie folgt aussehen:

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

    Erklärung

    Erstes Argument in ist name Attribut des Tags. Zweitens ist value Attribut. Der dritte Wert ist ein boolescher Wert, der angibt, ob das Kontrollkästchen beim ersten Rendern aktiviert wird oder nicht. Dies wird in edit Formular hilfreich sein, um aktuelle Auswahlen anzuzeigen.

    Beachten Sie, dass ich id Attribut explizit bereitstellen. Wenn wir das nicht tun, haben alle drei Kontrollkästchen die gleiche ID (abgeleitet von ihren Namen), was kein gültiger HTML-Code wäre, da die ID nicht wiederholt werden sollte.

    generiert HTML sollte wie folgt aussehen:

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

    Die controllerchannels param als ein Array von ausgewählten Werten sehen.

    Dies sollte sowohl für neue und bearbeiten Formen funktionieren.

    +0

    Das funktioniert! Danke für die tolle Antwort. Sehr gründlich und leicht zu verstehen. Genau das, was ich brauchte. – shroy

    +2

    Wörter, Lösungscode, Erklärung des Codes. Auch höflich. Kann SO bitte mehr von dir haben. 0 / – Jetblackstar