ruby - Rails 4: Save Checkbox Results to Serialized Array -
i have campaign model channel column. channel store serialized array of chosen results via checkboxes.
here's model..
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 launched!" redirect_to @campaign else flash[:error] = "there problem launching 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 the part of form checkboxes..
views/campaigns/_target.rb
<%= form_for @campaign, url: {action: "create"} |f| %> ... <label class="right-inline"> <%= f.label :channel, "distribution channel", class: "right-label" %> </label> <ul class="channel-list"> <% ["folder", "fax", "email"].each |channel| %> <li><%= check_box_tag :channel, channel %> <%= channel %> <% end %></li> </ul> ... <% end %> i'm having problems saving these results inside campaign object.
any highly appreciated.
first of all, mentioned column name channel, have used plural version in campaign model. since planning save array of channels in column, suggest change name of column in database channels. code below assumes change database column channels.
since serializing channels attribute array , form send parameter array controller, need update campaign_params method accordingly.
def campaign_params params.require(:campaign).permit(:name, :comment, :plan_id, :program_id, :campaign_id, uploadpdf_ids: [], channels: []) end now, relevant part of @campaign form should this:
<ul class="channels-list"> <% ["folder", "fax", "email"].each |channel| %> <li><%= check_box_tag "campaign[channels][]", channel, @campaign.channels.include?(channel), id: "campaign_channels_#{channel}" %> <%= channel %></li> <% end %> </ul> explanation
first argument in check_box_tag name attribute of tag. second value attribute. third boolean value tell whether checkbox checked or not when rendered initially. helpful in edit form show current selections.
note providing id attribute explicitly. if don't that, 3 checkboxes have same id (derived names), not valid html because id should not repeated.
generated html should this:
<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> the controller see channels param array of selected values.
this should work both new , edit forms.
Comments
Post a Comment