Rails Grouped Collection Выберите значение - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть форма.Если выбрана категория, в которой нет подкатегорий, по умолчанию используется значение 0 при добавлении в базу данных.Но когда оно отредактировано, значение не изменяется, если подкатегория не существует.

У меня есть сценарий кофе, скрывающий поле формы подкатегории, если он не существует.

Например, у меня может быть две категории:

Детали

Аксессуары

В категории Детали могут быть две подкатегории, такие как диски и шины.Но категория Аксессуары может вообще не иметь подкатегорий.

<div class="form-group">
  <%= f.label "Category" %>
  <%= f.collection_select(:product_category_id, ProductCategory.all, :id, :name) %>
</div>
<div class="form-group">
  <%= f.label :product_subcategory_id, "Subcategory", class: "control-label" %>
  <%= f.grouped_collection_select(:product_subcategory_id, ProductCategory.order(:name), :product_subcategories, :name, :id, :name) %>
</div>

Я хочу, чтобы значение product_subcategory_id было установлено на 0 , если подкатегория не выбрана.

ОБНОВЛЕНИЕ : prodcut_controller.rb

def update
  @product = Product.find(params[:id])

  if params.has_key?(:product_subcategory_id)
  else
    params[:product_subcategory_id] = 0
  end

  if @product.update_attributes(product_params)
    flash[:success] = "Updated successfully."
    redirect_to admin_products_path
  else
    render 'edit'
  end
end

1 Ответ

0 голосов
/ 13 декабря 2018

Поскольку вы сказали, что у вас есть coffescript, скрывающий ввод, если подкатегория не существует, но я не уверен, удаляет ли он ввод из dom, или просто скрывает его с помощью css.

Вариант 1:

Если coffeescript удаляет его из домена, вы можете добавить скрытый ввод:

<%= form.hidden_field : product_subcategory_id, value: 0 %>

Таким образом, рельсы забирают его при отправке, и вы можете обрабатывать его вHTML против контроллера, если это то, что вы предпочитаете.Это будет работать только в том случае, если выборка удалена из домена, а не скрыта.

Опция 2:

Если coffeescript просто скрывает его с помощью CSS, вы можете установить значение по умолчанию для первого/ выбранный параметр равен 0.

<%= form.select :product_subcategory_id, options_for_select([["", 0], "Foo", "Bar", "Buzz"]) %>

Возможно, вам придется создавать свои параметры вручную вместо использования grouped_collection_select, если вы переходите к варианту 2, поэтому вы можете добавить пользовательский параметр по умолчанию, который по умолчанию равен 0.

Вариант 3:

Обрабатывать его в методе / службе контроллера.

subcategory_id = params[:product_subcategory_id] ? params[:product_subcategory_id] : 0

Надеюсь, это поможет или даст вам некоторые идеи!

РЕДАКТИРОВАТЬ:

Mutating product_params, вероятно, самый простой.

def update
  @product = Product.find(params[:id])
  product_params[:product_subcategory_id] = 0 unless product_params[:product_subcategory_id]
  if @product.update_attributes(product_params)
    flash[:success] = "Updated successfully."
    redirect_to admin_products_path
  else
    render 'edit'
  end
end

Если вы не хотите изменять, вы можете:

def update
  @product = Product.find(params[:id])
  # Similiar to .new, but for updating.
  @product.assign_attributes(product_params)
  # Override the existing subcategory if product_params[:product_subcategory_id] is falsey
  @product.product_subcategory_id = 0 unless product_params[:product_subcategory_id]
  # Save
  if @product.save
    flash[:success] = "Updated successfully."
    redirect_to admin_products_path
  else
    render 'edit'
  end
end

Или, если вы находитесь на Rails 5+, вы можете установитьпо умолчанию с атрибутами api.

class Product < ApplicationRecord
  attribute :product_subcategory_id, :integer, default: 0
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...