Rails форма для редактирования коллекции

0

То, что я пытаюсь выполнить, - это простой флажок "переключить" для включения/выключения для представления, которое содержит записи из модели.

Я попытался заглянуть в "скрытую" ценность, но, похоже, она не работает должным образом.

Как получить пустые флажки для передачи как false в params

Когда я добавил: <%= hidden_field_tag "category_ids[]", '' %>

Я получаю Couldn't find Category with 'category_name'= при снятии отметки.

По существу, таблица является Model.all, но я хочу иметь возможность модифицировать значение ключа в столбце is_active для true или false, в зависимости от того, установлен флажок или нет. В настоящее время я могу выполнить это для "проверки" окна. Но, не сняв флажок (пропускает null). Я стараюсь, чтобы это было одним махом, а не всеми моими чеками, и еще один проход для моего неконтролируемого. И, в обход процесса show/edit. Размер таблицы довольно мал, поэтому меня не интересует латентность.

Я пытался найти столько, сколько мог, но я в недоумении. С тем, что я нашел, я могу сделать то или другое, но не так, как к сожалению, и я был бы очень признателен за любое руководство.

Мой взгляд:

<h4>Categories</h4>
<%= form_tag enable_categories_path, method: :put do |f| %>
<table id="myTable" class="table table-bordered table-striped">
  <tr>
    <th>Enable</th>
    <th>Category Name</th>
    <th>Active</th>
  </tr>

  <tbody>
  <% @categories.each do |category| %>
    <tr>
      <td>
        <%= check_box_tag "category_ids[]", category.id, category.is_active == 1 ? 'checked' : nil %>
      </td>
      <td><%= link_to category.category_name, category %></td>
      <td><%= category.is_active == 1 ? 'Yes' : 'No' %></td>
    </tr>
  <% end %>
  </tbody>
</table>
<%= render 'settings/button' %>
<% end %>

Здесь флажки захватывают свое состояние из самой модели для соответствующей записи, поэтому, если в флажке ничего не предпринимается, он остается тем же (или передает состояние обратно)

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

class CategoriesController < ApplicationController
  before_action :set_category, only: [:show, :edit, :update]

  def index
    @categories = Category.all.order(:category_sort)
  end

  def show
    @category = Category.find(params[:id])
  end

  def edit
  end

  def update
    if @category.update(category_params)
      redirect_to categories_path
    else
      render :edit
    end
  end

  def enable
    Category.update(params[:category_ids], params[:category_ids].map{ |e| {is_active: true} })
    redirect_to categories_path
  end

  private

  def set_category
    @category = Category.find(params[:id])
  end

  def category_params
    params[:category].permit(:id, :category_name, :is_active)
  end

end

В настоящее время я передаю is_active: true, пока не смогу определить способ передать ВСЕ состояния флажка.

Моя модель:

class Category < ActiveRecord::Base
  self.table_name  = 'categories'

  has_many   :metrics
end

Мой маршрут:

resources :categories do
    collection do
      put :toggle
    end
  end

Кажется, что все правильно передается для отмеченных ящиков. Но в журналах ничего не появляется, когда что-то не проверено.

  • 1
    Не могли бы вы каким-то образом реализовать collection_check_boxes? apidock.com/rails/v4.0.2/ActionView/Helpers/FormOptionsHelper/...
  • 0
    Я считаю, что collection_check_boxes лучше всего работают с ассоциациями. Где, поскольку категории не имеют ассоциаций (по крайней мере, в способе редактирования)
Показать ещё 2 комментария
Теги:
forms

2 ответа

1
Лучший ответ

Когда я сталкивался с такими ситуациями в Rails, я обычно заканчиваю использование AJAX, а не массовое задание. Это на самом деле довольно легко. По крайней мере, легче для меня, чем изучение внутренней работы check_boxes и collection_check_boxes, LOL

Простая таблица категорий:

    <table>
  <thead>
    <tr>
      <th>Category</th>
      <th>Status</th>
    </tr>
  </thead>

  <tbody>
    <% @categories.each do |category| %>
      <tr>
        <td><%= category.category_name %></td>
        <% status = category.is_active? ? 'Active' : 'Inactive' %>
        <td id="<%= category.id %>" ><button class="button_<%= status %>"><%= link_to status, toggle_active_path(:id => category.id), :method => :post, :remote => true %></button></td>
      </tr>
    <% end %>
  </tbody>
</table>

Строки, на которые следует обратить внимание, - это встроенный рубин, устанавливающий переменную status. Это используется для установки значения класса для кнопки. В файле CSS кнопка class button_Active устанавливает цвет в зеленый цвет, а button_Inactive делает его красным. Он также использует эту переменную для установки текста кнопки.

Изображение 174551

Создайте в контроллере метод, который переключает статус:

def toggle_is_active
@category.toggle!(:is_active) #flips the boolean on is_active
respond_to do |format|
  format.html { redirect_to(@category) }
  format.js
end

Имейте в .toggle! что .toggle! будет обходить проверки модели и сохранить. Если вам нужно обеспечить выполнение @category.toggle(:is_active).save вы можете использовать @category.toggle(:is_active).save

Это ответит format.js и вызовет очень маленький файл toggle_is_active.js.erb:

$('#<%= @category.id %>').html('<%= escape_javascript(render :partial => 'toggle_active') %>');

Это задает id элемента html, который мы задали для id категории в строке таблицы.

Это вызывает частичное имя _toggle_active.html.erb и обновляет соответствующий <td> новый html:

<% status = @category.is_active? ? 'Active' : 'Inactive' %>
<button class="button_<%= status %>"><%= link_to status, toggle_active_path(:id => @category.id), :method => :post, :remote => true %></button>

Теперь вам нужен только маршрут для доступа к ссылке AJAX:

routes.rb:

post 'toggle_active' => 'categories#toggle_is_active'

Вот рабочий пример, который вы можете клонировать на github. У него есть таблицы стилей, чтобы посмотреть выше. Я думаю, вы можете экстраполировать это практически для любой ситуации:

https://github.com/Beartech/category_boxes

  • 0
    Я использую такое решение, потому что мне не нужны формы, и я могу поместить их в любое место. Если вы используете что-то вроде Bootstrap, то легко class: "btn ..." кнопки с помощью class: "btn ..." в конце link_to .
0

Давайте рассмотрим, что происходит здесь:

  def enable
    Category.update(params[:category_ids], params[:category_ids].map{ |e| {is_active: true} })
    redirect_to categories_path
  end

Можете ли вы опубликовать, какие params[:category_ids] выглядят здесь? map здесь не совсем понятна. Кроме того, каков тип данных is_active в базе данных?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню