Rails для многоэтапной отладки форм - ActionController :: ParameterMissing - PullRequest
0 голосов
/ 14 апреля 2020

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

Я использую это решение для создания многошаговой формы без драгоценного камня Wicked: Лучший способ создать многошаговую форму в Rails 5

Кажется, я могу создать продукт, когда использую binding.pry и ввожу необходимые команды в моей консоли rails.

Однако само по себе приложение не работает, и мне не удается обойти его ..

Два вопроса выбросить ActionController :: ParameterMissing ошибка:

1) Во-первых, всякий раз, когда я намереваюсь нажать кнопку back_, она вызывает ошибку ParameterMissing (точное сообщение об ошибке см. В конце).

2) Когда я попадаю на последний шаг формы, он отображает всю необходимую информацию, но не создает и не сохраняет новые продукты (также ParameterMissing).

Вот мой код:

Маршруты


  get 'products/new', to: 'products#new', as: 'new_product'
  post 'products', to: 'products#create', as: 'create_new_product'

  resources :categories, only: [:index, :show, :new, :edit, :destroy] do
    resources :sub_categories, only: [:index, :show, :new, :edit, :destroy]
    resources :products, only: [:index, :show, :destroy]
  end

Контроллер продуктов

class ProductsController < ApplicationController
  skip_after_action :verify_authorized, except: :index, unless: :skip_pundit?
  skip_after_action :verify_policy_scoped, only: :index, unless: :skip_pundit?
  before_action :set_category, only: [:index, :show]

  def new
    session[:product_params] ||= {}
    authorize @product = Product.new(session[:product_params])
    @product.current_step = session[:product_step]
    @product.user = current_user
  end

  def create

    session[:product_params].deep_merge!(params_product) if params_product
    authorize @product = Product.new(session[:product_params])
    @product.current_step = session[:product_step]

    @product.user = current_user

    if @product.valid?

      if params[:back_button]
        @product.previous_step

      elsif @product.last_step?
        if @product.all_valid?
          @product.save!
          flash[:notice] = 'Your product was created successfully'
          redirect_to newest_products_path && return
        end

      else
        @product.next_step
      end

    end
    session[:product_step] = @product.current_step

    if @product.new_record?
      return render :new

    else
      session[:product_step] = session[:product_params] = nil
    end
  end

  private

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

  def params_product
    params.require(:product).permit(:name, :price, :description, :category, :category_id,
                                    :sub_category, :sub_category_id, :user, :user_id, :id)
  end
end

Модель продукта

class Product < ApplicationRecord
  attr_writer :current_step

  belongs_to :user, optional: true
  belongs_to :sub_category
  belongs_to :category, inverse_of: :products

  validates :category, presence: true

  validates_presence_of :name, :category_id, if: lambda { |e| e.current_step == "card" }
  validates_presence_of :sub_category_id, :description, :price, if: lambda { |e| e.current_step == "details" }

  def current_step
    @current_step || steps.first
  end

  def steps
    %w[card details confirmation]
  end

  def next_step
    self.current_step = steps[steps.index(current_step) + 1]
  end

  def previous_step
    self.current_step = steps[steps.index(current_step) - 1]
  end

  def first_step?
    current_step == steps.first
  end

  def last_step?
    current_step == steps.last
  end

  def all_valid?
    steps.all? do |step|
      self.current_step = step
      valid?
    end
  end
end

Просмотр новых продуктов

      <%= form_for @product, url: create_new_product_path do |f| %>
        <%= render "#{@product.current_step}_step", :f => f  %>
        <div class="bottom-signup">
          <%= f.submit "Continue" unless @product.last_step? %>
          <%= f.submit "Submit Product" if @product.last_step? %>
          <%= f.submit "Back", :name => "back_button" unless @product.first_step? %>
        </div>
      <% end %>

Вот точная ошибка , выдаваемая ActionController :

ActionController::ParameterMissing in ProductsController#create

param is missing or the value is empty: product

#around ligne (96)

95  def params_product
96    params.require(:product).permit(:name, :price, :description, :category, :category_id,
97                                    :sub_category, :sub_category_id, :user, :user_id, :id)
98  end

И, наконец, вот что появляется, если я подниму params.inspect :

params.inspect

=> "<ActionController::Parameters {\"utf8\"=>\"✓\", \"authenticity_token\"=>\"AHfNwkeFOWBeEup+fCCvfZv1RowuP/YULHjo8kTnzer5YNCY7lMYAKzrrWJBVMcfOO+P1GmZGgi9PDpa/09rzw==\", \"commit\"=>\"Submit Product\", \"controller\"=>\"products\", \"action\"=>\"create\"} permitted: false>"

Если кто-то поймет, где я неправ, я буду более чем рад scuss it!

Заранее спасибо.

Лучший, Ist

...