Как я могу установить значение из выпадающего списка на рельсах? - PullRequest
0 голосов
/ 21 января 2020

Я новичок на рельсах. У меня есть товар - список брендов.

маршруты рб

Rails.application.routes.draw do
  get 'welcome/index'
  # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
  resources :brands do
    resources :products
  end
  root 'welcome#index'
end

Brand.rb

class Brand < ApplicationRecord
  has_many :products, dependent: :destroy
  validates :title, presence: true,
                    length: { minimum: 2 }
end

Product.rb

class Product < ApplicationRecord
  belongs_to :brand
end

продукты. контроллер

class ProductsController < ApplicationController
  #before_action :set_brand
  skip_before_action :verify_authenticity_token

  def new
    if params[:brand_id]
      @brand = Brand.find(params[:brand_id])
    end
    @product = Product.new

  end

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

  def update
    @brand = Brand.find(params[:brand_id])
    @product = Product.find(params[:id])
    @product.update(product_params)
    redirect_to brand_path(@brand)
  end

  def create
    @brand = Brand.find(params[:brand_id])
    @product = @brand.products.create(product_params)
    redirect_to brand_path(@brand)
  end

  def destroy
    @brand = Brand.find(params[:brand_id])
    @product = @brand.products.find(params[:id])
    @product.destroy
    redirect_to brand_path(@brand)
  end

  def update
    @brand = Brand.find(params[:brand_id])
    @product = @brand.products.find(params[:id])
    @product.destroy
  end

  helper_method :update

  private
    def product_params
      params.require(:product).permit(:name)
    end

    def set_brand
      @brand = Brand.find(params[:brand_id])
    end

end

... / products / new. html .erb

<h1>Add a new product</h1>
<%= form_with(model: [ @brand, @brand.products.build ], local: true) do |form| %>
  <p>
    <%= form.label :name,"Product name: " %><br>
    <%= form.text_field :name %>
  </p>

  <p>

  </p>
  <%= form.label :title,"Select a Brand" %>
  <%= form.collection_select(:brand_id, Brand.all, :id, :title,{selected: @brand.id}) %>

  <p>
    <%= form.submit "Add a product" %>
  </p>

<% end %>

new. html .erb picture

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

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Вы забыли разрешить параметр в product_params. Это должно быть:

params.require(:product).permit(:name, :brand_id)

Неразрешенные параметры игнорируются методами create и update.

0 голосов
/ 21 января 2020

Поскольку у вас уже есть настроенные продукты как вложенный ресурс, вам не нужно или не нужно выбирать. Параметр brand_id будет передан через путь (атрибут действия формы). Пользователь будет выбирать, к какому бренду он хочет добавить товар, по какой ссылке он щелкнул, чтобы перейти на новую форму.

Хотя вы можете добавить выбор в форму, это основной момент WTF при отправке:

POST /brands/1/products, { products: { brand_id: 5 }}

И в итоге создается продукт, который не относится к бренду 1. Если бы параметр из формы был пустым, вы бы также получили действительно странный результат.

Если бы вы действительно хотели Форма, в которой пользователь выбирает «целевую» марку на самой форме, вы создадите не вложенную информацию:

<%= form_with(model: @product) do |f| %>
  <%= f.collection_select :brand_id %>
<% end %>

class ProductsController < ApplicationController
  # GET /products/new
  def new
    @product = Product.new
  end

  # POST /products
  def create
    @product = Product.new(product_params)
    if @product.save
       redirect_to @product
    else
       render :new
    end
  end

  def product_params
     params.require(:product).permit(:foo, :bar, :brand_id)
  end
end
...