То, что я пытаюсь выполнить, - это простой флажок "переключить" для включения/выключения для представления, которое содержит записи из модели.
Я попытался заглянуть в "скрытую" ценность, но, похоже, она не работает должным образом.
Как получить пустые флажки для передачи как 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
Кажется, что все правильно передается для отмеченных ящиков. Но в журналах ничего не появляется, когда что-то не проверено.
Когда я сталкивался с такими ситуациями в 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
делает его красным. Он также использует эту переменную для установки текста кнопки.
Создайте в контроллере метод, который переключает статус:
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. У него есть таблицы стилей, чтобы посмотреть выше. Я думаю, вы можете экстраполировать это практически для любой ситуации:
class: "btn ..."
кнопки с помощью class: "btn ..."
в конце link_to
.
Давайте рассмотрим, что происходит здесь:
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
в базе данных?