2015-06-12 19 views
6

Ho un modello Campaign con una colonna channel. Questo channel memorizzerà una matrice serialized di risultati selezionati tramite caselle di controllo.Rails 4: Salva risultati casella di controllo in serie serializzata

Ecco il modello ..

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

La parte del modulo con caselle di controllo ..

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

sto avendo problemi salvando questi risultati all'interno dell'oggetto campagna.

Qualsiasi aiuto è molto apprezzato.

+1

per prima cosa penso che "ogni" ciclo sia sbagliato. In ogni ciclo crei un '

  • ' e hai un solo '
  • ' fuori dal ciclo. – inye

    risposta

    19

    Prima di tutto, lei ha detto che il nome di colonna è channel, ma hanno utilizzato la sua versione plurale in Campaign modello. Dato che stai pianificando di salvare array di canali in questa colonna, ti suggerirei di cambiare il nome della colonna nel database in channels. Tutto il codice seguente presuppone che cambierai la colonna del database in channels.

    Dal momento che si serializzare l'attributo channels a un Array e il modulo invierà tale parametro come array al controller, è necessario aggiornare il metodo di campaign_params conseguenza.

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

    Ora, la parte pertinente del modulo @campaign dovrebbe essere così:

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

    Spiegazione

    primo argomento è name attributo del tag. Il secondo è l'attributo value. Terzo è il valore booleano per indicare se la casella di controllo verrà selezionata o meno al momento del rendering iniziale. Questo sarà utile nel modulo edit per mostrare le selezioni correnti.

    Nota che sto fornendo l'attributo id in modo esplicito. Se non lo facciamo, tutte e tre le caselle avranno lo stesso id (derivato dal loro nome), che non sarebbe HTML valido perché l'ID non dovrebbe essere ripetuto.

    HTML generato dovrebbe essere simile a questo:

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

    Il controller vedrà channels param come un array di valori selezionati.

    Questo dovrebbe funzionare sia per i moduli Nuovo che Modifica.

    +0

    Funziona! Grazie per l'ottima risposta. Molto completo e facile da capire. Esattamente quello di cui avevo bisogno. – shroy

    +2

    Parole, codice soluzione, spiegazione del codice. Anche educato. Può quindi per favore avere più di voi. 0 / – Jetblackstar