Rails 5: параметр отсутствует и не отображается для редактирования или несохраненного обновления или недопустимых параметров - PullRequest
0 голосов
/ 05 марта 2019

Использование Devise, Rails 5.0.6, Sqlite 3, Простая форма, Active Record 5.0.

Перепрыгивание между двумя проблемами с параметрами, так как поиск много похожих проблем / решений в Stack Overflow.В обоих случаях единственными параметрами, которые отображаются как передаваемые в ошибках Ruby или журналах сервера, является {id => "n"} (где n - правильный номер любого продукта) вместо полного списка параметров.

Я чувствую, что есть проблема или с тем, как я настроил Devise, или с тем, как я настроил Простую форму ... но не уверен.Пожалуйста, помогите !!!

Краткое сравнение:

Проблема № 1: Параметр отсутствует, не отображается продукт # Редактировать

  • Это происходиткогда мне нужны параметры в моем методе product_parameters.
  • Ruby не может выполнить рендеринг и извлекает ActionController :: ParameterMissing в ProductsController # ошибка редактирования.
  • Параметры запроса: {"id" => "2"}

Проблема № 2: Редактировать форму, но запись о товаре не обновляется

  • Нет ошибок, флэш-сообщение подтверждает успех и повторное представление. Шоу продукта
  • Обновление атрибутов

  • Журнал сервера Rails сообщает:

    Недопустимые параметры: utf8, _method, authenticity_token, product, параметры продукта фиксации: "2"} разрешено: true> Перенаправлено на http://localhost:3000/products/2 Завершено 302 Найдено за 8 мс (ActiveRecord: 0,4 мс)

Вот мой код:

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

    class Product < ApplicationRecord 
belongs_to :category

  has_many :product_specs
  has_many :specifications, through: :product_specs
end

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

class ProductsController < ApplicationController
  before_action :set_category, only: [:new, :create]
  before_action :set_product, only: [:edit, :show, :update, :destroy]


  def index
    @products = Product.all
    @categories = Category.all
    @message = Message.new
    @message.build_company
  end

  def new
    @product = Product.new
    @categories = Category.all
    @message = Message.new
    @message.build_company
    @specification = Specification.new

  end

  def create
    @message = Message.new
    @message.build_company
    @categories = Category.all

    @product = Product.new(product_parameters)
    @product.category_id = product_parameters[:category_id]

    if @product.save!
      redirect_to product_path(@product)
    else
      render "new"
      puts "fail"
    end
  end

  def show
    @categories = Category.all
    @message = Message.new
    @message.build_company
  end

  def edit

    @message = Message.new
    @message.build_company
    @categories = Category.all
    @product.update(product_parameters)
  end

  def update
    if @product.update(product_parameters)
      # @product.update(product_parameters)
      flash[:success] = "You have updated the #{@product.name} product"
      puts "SUPPOSEDLY UPDATING"
      print "product parameters: #{product_parameters.inspect}"
      redirect_to product_path(@product)
    else
      puts "SUPPOSEDLY NOT UPDATING"
      flash.now[:error] = "You have not updated #{@product.name}"
      render :edit
    end
  end

  private

  def build_company
    @message.build_company
  end

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

  def product_parameters

    # Problem 1 => Keep 'require' : Edit Form Fails to Render, ActionController::ParameterMissing in ProductsController#edit
    # params.require(:product).permit(:id, :name, :description, :picture, :product_spec_id)

    # Problem 2 => Delete 'require': Edit Form renders, but fails to update Product record
    params.permit(:id, :name, :description, :picture, :product_spec_id)

  end

end

Маршруты

Rails.application.routes.draw do

  devise_for :users

  root to: 'pages#index', as: :home

  get 'contact', to: 'messages#new', as: :contact
  get 'about', to: 'pages#about', as: :about
  get 'exa', to: 'pages#exa', as: :exa
  get 'services', to: 'pages#services', as: :services
  get 'messages', to: 'messages#show', as: :contactconfirm

  resources 'products'
  resources 'categories'

  resources 'posts'

  resources 'messages' do
    resources :companies, only: [:new, :create, :show, :edit, :update]
    resources :industries, only: [:index, :show]
  end

end

Продукты / Edit.html.erb

<%= simple_form_for(@product) do |product| %>
<h4 class="product_name">
  <%= product.input :name, placeholder: "Product Name" %>
</h4>
  <div class="product_picture">
    <%= image_tag("products/IPC_tablet.png") %>
  </div>

  <div class="product_description">
    <strong>Description</strong>
    <p class="font-size-12">
      <%= product.input :description, label: false %>
    </p>
    <%= product.association :category, prompt: "Select Category" %>
  </div>
    <div class="product_admin_actions">
      <div>Add A Specification</div>
    </div>
  <%= product.button :submit, "Save This Product" %>
    <% end %>

Ответы [ 3 ]

1 голос
/ 05 марта 2019

Удалить продукт обновления со страницы редактирования.

def edit
    @message = Message.new
    @message.build_company
    @categories = Category.all
end

Метод product_parameters должен быть.

def product_parameters
  params.require(:product).permit(:id, :name, :description, :picture, 
                                  :product_spec_id)
  #params.require(:product).permit! for permitting all attributes. 
end

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

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

Каждое действие представляет собой страницу шаблона, если только оно не отображается в другом шаблоне.

Итак, products#edit => products/edit.html.erb

В edit.html.erb содержит предварительно заполненные данные, которыеточно из products_controller's edit action -

после отправки формы редактирования данные будут отправлены в update action и обновят данные о products#update action.

Итак, обновлениепроисходит при обновлении, а не при редактировании, т.е.

  def edit
    @message = Message.new
    @message.build_company
    @categories = Category.all
    #@product.update(product_parameters)
  end
0 голосов
/ 05 марта 2019

Вы не должны обновлять в действии редактирования, это действие только для визуализации формы.Удалите строку

@product.update(product_parameters)

из действия редактирования.

product_parameters должно быть с обязательной деталью для корректного обновления продукта

...