используя cocoon и флажки, я не знаю, как распознать checked: true или false в edit

#ruby-on-rails #checkbox #include #nested-forms #apache-cocoon

#ruby-on-rails #флажок #включить #вложенные формы #apache-cocoon

Вопрос:

Я новичок в разработке проекта rails, у меня есть вложенная форма для отправки события и заявки с помощью gem ‘cocoon’.И в форме есть несколько флажков. Когда вы отправляете new , это не имеет значения, но в edit вы не можете поставить checked в мои флажки.

Как мне это сделать, учитывая мой приведенный ниже код?

Моя ошибка

 undefined method `include?' for nil:NilClass

  <%= f.check_box :payment_type, { multiple: true ,checked:f.object.payment_type.include?(pay), include_hidden: false }, pay %>
  <%= f.label :payment_type, pay, :value => i %>
 

Моя модель

 class Event < ActiveRecord::Base
  has_many :tickets, inverse_of: :event 
  accepts_nested_attributes_for :tickets, allow_destroy: true

class Ticket < ActiveRecord::Base
    belongs_to :event 
 

Мой контроллер

 class EventsController < ApplicationController
    before_action :set_event, only: [:show, :edit, :update, :destroy]   

   def new
      @event = Event.new
    end

    def create
    @event = Event.new(event_params)
      if @event.save
          flash[:notice] = 'wow'
        redirect_to @event
      else
          flash[:notice] = 'oh..'
          render 'new'
      end
    end

    def edit
    end

    def update
        if @event.update(event_params)
        redirect_to @event
        else
        render 'edit'
        end
    end  
 

Моя форма

 <div class="nested-fields">
<h3>tickets</h3>


<div class="row formsection text-center">
    <div class="col-md-3">
    <span class="label-title">fee</span>
    </div>
    <div class="col-md-9">
    <div class='input-group'>       
    <%= f.text_field :fee, :placeholder => "fee" , :class => "form-control" %>
    </div>
    </div>   
</div>     


<div class="row formsection text-center">
    <div class="col-md-3">
    <span class="label-title">payment</span>
    </div>

    <div class="col-md-9"> 
    <%= f.hidden_field :id %>

<% payments = { 'paypal' => 1, 'credit card' => 2  } %>
<% payments.each do |pay,i| %>

<%= f.check_box :payment_type, { multiple: true ,checked: f.object.payment_type.include?(i), include_hidden: false }, i %>
<%= f.label :payment_type, pay, :value => i %>

<br>
<% end %>   

   </div>     
</div>  


<%= link_to_remove_association 'remove this', f %>
</div>
 

Комментарии:

1. Ваш отступ / форматирование повсюду. Хотя это может показаться не важным, поскольку компьютеру это не нужно, это облегчает чтение кода и облегчает просмотр / понимание структуры. Поэтому это важно. Сначала вы пишете код, который должен быть прочитан людьми (например, самим собой).

Ответ №1:

Не уверен, почему это работает new , но if payment_type еще не установлено, и поэтому равно nil, это выдаст ошибку, которую вы показали.

Поэтому вместо этого напишите что-то вроде:

 <%- checked_value = f.object.payment_type.present? amp;amp; f.object.payment_type.include?(i) %>
<%= f.check_box :payment_type, { multiple: true ,checked: checked_value, include_hidden: false }, i %>