2015-06-12 15 views
6

channel sütunlu bir Campaign modelim var. Bu channel, onay kutularıyla seçilen sonuçların bir serialized dizisini saklayacaktır. İşte Raylar 4: Kaydedilen Sonuçları Seri Dizilime Kaydet

formun parçası modeli ..

app/modeller/campaign.rb

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

app/kontrolörleri/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 

var onay kutularıyla birlikte ..

görüntüleme/kampanyalar/_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 %> 

Kampanya nesnesinin içinde bu sonuçları kaydetme sorun yaşıyorum.

Herhangi bir yardım çok takdir edilmektedir.

+1

Önce her birinizin yanlış olduğunu düşünüyorum. Her döngüde bir "

  • " oluşturuyorsunuz ve yalnızca bir "
  • " döngüsünden bir tane var. – inye

    cevap

    19

    İlk olarak, sütun adının channel olduğunu belirttiniz, ancak çoğul sürümünü Campaign modelinde kullandınız. Bu sütunda kanal dizisini kaydetmeyi planladığınızdan, veritabanındaki sütunun adını channels olarak değiştirmenizi öneririm. Aşağıdaki kodun tamamı, veritabanı sütununu channels olarak değiştireceğinizi varsayar. Eğer kontrolöre bir dizi olarak bu parametreyi gönderecek bir Array ve forma channels niteliğini seri olduğundan

    , buna göre campaign_params yöntemini güncellemeniz gerekir.

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

    Açıklama yılında

    Birinci argüman etiketinin name niteliktir:

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

    Şimdi, @campaign formun ilgili bölümü aşağıdaki gibi görünmelidir. İkincisi value özniteliğidir. Üçüncüsü, onay kutusunun başlangıçta işlendiğinde kontrol edilip edilmeyeceğini belirtmek için boole değeridir. Bu geçerli seçimleri göstermek için edit formunda yardımcı olacaktır.

    id özniteliğini açıkça sağladığımı unutmayın. Bunu yapmazsak, üç onay kutusunun tümü, kimliğinin tekrarlanmaması gerektiğinden, geçerli HTML olmayacak olan (adlarından türetilen) kimliğe sahip olacaktır.

    Oluşturulan HTML gibi görünmelidir:

    <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 seçilen değerler dizisi olarak channels param göreceksiniz.

    Bu, hem Yeni hem de Düzenleme formları için çalışmalıdır.

    +0

    Bu işe yarıyor! Büyük yanıt için teşekkür ederim. Çok kapsamlı ve anlaşılması kolay. Tam olarak ihtiyacım olan şey. – shroy

    +2

    Kelimeler, çözüm kodu, kodun açıklaması. Ayrıca kibar. SO lütfen daha fazla olabilir. 0 / – Jetblackstar