Я понимаю, что эта проблема поднималась несколько раз, но я не могу найти способ обойти ..
Я использую это решение для создания многошаговой формы без драгоценного камня 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