Создайте действие с помощью множества, чтобы назначить любимую категорию - PullRequest
0 голосов
/ 18 марта 2019

Проблема

Я пытаюсь создать промежуточную таблицу с именем category_profiles, это промежуточная таблица для назначения избранных категорий моим профилям, но я не могу получить доступ к category_ids, который явведите в форму, всегда я получал одну и ту же проверку, категория не существует:

код:

class CategoryProfile < ApplicationRecord
  belongs_to :profile
  belongs_to :category
end

class Category < ApplicationRecord
has_many :category_profiles
has_many :profiles, through: :category_profiles

class Profile < ApplicationRecord
has_many :category_profiles
has_many :categories, through: :category_profiles

Когда я выполняю действие создания, мой контроллер не может найтимоя категория.Как мне это исправить?

Мое действие создания никогда не находит идентификаторы моих категорий для присвоения category_profiles.Он имеет много сквозных отношений:

Module Account

  class FavoritesController < Account::ApplicationController

    before_action :set_category_profile

    def index
      @favorites = @profile.categories

    end

    def new
      @categories = Category.all
      @category_profile = CategoryProfile.new
    end

    def create
      @category_profile = @profile.category_profiles.new(category_profile_params)
      if @category_profile.save
        flash[:success] = t('controller.create.success',
                            resource: CategoryProfile.model_name.human)
        redirect_to account_favorites_url
      else
        flash[:warning] = @category_profile.errors.full_messages.to_sentence
        redirect_to account_favorites_url
      end
    end

    def destroy
    end

    private
    def set_category_profile
      @category_profile = CategoryProfile.find_by(params[:id])
    end

    def category_profile_params
      params.permit(:profile_id,
                      category_ids:[])
    end
end
end

Форма

<%= bootstrap_form_with(model: @category,method: :post ,  local: true, html: { novalidate: true, class: 'needs-validation' }) do |f| %>
  <div class="form-group">
    <%= collection_check_boxes(:category_ids, :id, Category.all.kept.children.order(name: :asc), :id, :name, {}, { :multiple => true} ) do |b| %>
      <%= b.label class: 'w-1/6 mr-4' %>
      <%= b.check_box class: 'w-1/7 mr-4' %>
    <%end %>
  </div>
  <div class="md:flex justify-center">
    <%= f.submit 'Guardar categoría favorita', class: 'btn btn-primary' %>
  </div>
<% end %>

1 Ответ

0 голосов
/ 18 марта 2019

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

def create
  begin
    @profile.categories << Category.find(params[:category_ids])

                          Or

    params[:category_ids].each do |category_id|
      @profile.category_profiles.create(category_id: category_id)
    end

    flash[:success] = t('controller.create.success',
                        resource: CategoryProfile.model_name.human)
    redirect_to account_favorites_url
  rescue
    flash[:warning] = @category_profile.errors.full_messages.to_sentence
    redirect_to account_favorites_url
  end
end

Нужно найти другой лучший способ обработки ошибок с использованием либо блока транзакции, либо чего-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...