Замена partial на AJAX в Rails 4: неопределенный метод `id`

#javascript #ruby-on-rails #ajax

#javascript #ruby-on-rails #ajax

Вопрос:

При замене partial через Ajax один метод дает мне правильный результат, а другой (почти идентичный) — нет. Я хочу выбрать и отменить выбор группы для конкретной кампании. Выбор дает мне прямую замену, отмена выбора — нет.

модели/general_connection.rb

 belongs_to :campaign
belongs_to :group
  

models/group.rb

 has_many :general_connections
has_many :campaigns, through: :general_connections
  

модели /campaign.rb

 has_many :general_connections
has_many :groups, through: :general_connections
  

контроллеры/general_connection.rb

 def connect_group_to_campaign
  @group = Group.find(params[:group_id])
  @campaign = Campaign.find(params[:campaign_id])
  @campaign.general_connections.create(group: @group)
  respond_to do |format|
        format.html { redirect_to :back }
        format.js
  end
end

def disconnect_group_from_campaign
  @general_connection = GeneralConnection.where("group_id = ? AND campaign_id = ?", params[:group_id], params[:campaign_id]).first
  @group = @general_connection.group

  @general_connection.destroy
  respond_to do |format|
        format.html { redirect_to :back }
        format.js
  end
end
  

views/campaign/show.html.erb

 <div class="row">
    <% @main_groups.each do |group| %>
        <%= render partial: 'groups_form', locals: { group: group } %>
    <% end %>
</div>
  

* просмотры /кампания/_groups_form.html.erb

 <div class="row" id="group_<%= group.id %>">
    <div class="col m6">
        <div class="valign-wrapper black-text">
            <% if group.icon.nil? %>
                <i class="material-icons">group</i>
            <% else %>
                <i class="material-icons"><%= group.icon %></i>
            <% end %>
                amp;nbsp;amp;nbsp<%= group.title %>
        </div>
    </div>
    <div class="col m6">
        <% if !grouped(group) %>                
            <%= form_tag connect_group_to_campaign_path(:group_id => group.id, :campaign_id => @campaign.id), remote: true do %>
                <%= button_tag 'check_box_outline_blank', class: "secondary-content material-icons grey-text", style: "background-color:white;border:none;" %>
            <% end %>
        <% else %>
            <%= form_tag disconnect_group_from_campaign_path(:group_id => group.id, :campaign_id => @campaign.id), remote: true do %>
                <%= button_tag 'check_box', class: "secondary-content material-icons grey-text", style: "background-color:white;border:none;" %>
            <% end %>
        <% end %>
    </div>
</div>
  

просмотры/general_connection/connect_group_to_campaign.js.erb

 $('#group_<%= @group.id %>').replaceWith('<%= j render partial: 'campaigns/groups_form', locals: {group: @group} %>');
  

просмотры/general_connection/disconnect_group_from_campaign.js.erb

 $('#group_<%= @group.id %>').replaceWith('<%= j render partial: 'campaigns/groups_form', locals: {group: @group} %>');
  

… и это ошибка, которую я получаю:

 ActionView::Template::Error (undefined method `id' for nil:NilClass):
12:                     </div>
13:                     <div class="col m6">
14:                         <% if !grouped(group) %>                
15:                             <%= form_tag connect_group_to_campaign_path(:group_id => group.id, :campaign_id => @campaign.id), remote: true do %>
16:                                 <%= button_tag 'check_box_outline_blank', class: "secondary-content material-icons grey-text", style: "background-color:white;border:none;" %>
17:                             <% end %>
18:                         <% else %>
  

Подводя итог: оба метода работают, но connect_group_to_campaign дают только прямой результат disconnect_group_from_campaign , а не требуют обновления браузера.

Кто-нибудь может мне помочь?

Ответ №1:

Кажется @campaign , объект не объявлен в disconnect_group_from_campaign методе. Попробуйте это после добавления строки ниже в свой disconnect_group_from_campaign метод

 @campaign = Campaign.find(params[:campaign_id])