добавить связанное значение в ruby на рельсах с независимой страницы - PullRequest
0 голосов
/ 21 января 2020

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

Марка,

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

Продукт,

class Product < ApplicationRecord
  belongs_to :brand
end

products.controller

class ProductsController < ApplicationController
   skip_before_action :verify_authenticity_token


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

  def new
    @product = Product.new
  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



end

новый. html .erb,

    <h1> Add a new product </h1>

<%= form_with model: @brand, local: true do |form| %>

<p>
  <%= form.label :title,"Product name" %><br>
  <%= form.text_field :name %>
</p>


  <p>
    <%= form.label :title,"Select a Brand" %><br>
    <%= form.collection_select(:brand, Brand.all, :id, :title) { @brand = Brand.find(params[:brand_id]) } %>

  </p>

  <p>
    <%= form.submit "Save Product", :onclick => "create" %>
  </p>

<% end %>

rout.rb

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

когда я нажимаю кнопку, я получаю ошибку, нет совпадений с маршрутом [POST] "/ бренды /% 23% 3CBrand :: ActiveRecord_Relation: 0x00007f5e30d87490% 3E / products / new "

Rails. root: / home / berkay / e-ticaret

ТАК, как я могу сохранить этот продукт?

Ответы [ 2 ]

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

измените это значение

<%= form_with model: @brand, local: true do |form| %>

на

<%= form_with(model: @product, url: [@brand, @product]) %>

Также добавьте

@brand = Brand.find(a_brand_id)

в ваш new метод ProductsController класс. Итак, rails узнает, какой бренд является родителем этого продукта.

ОБНОВЛЕНИЕ

Я создал фиктивный проект, который будет работать так, как вы ожидали.

products / _form. html .erb частично для продукта

<%= form_with(model: product, local: true) do |form| %>
  <% if product.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(product.errors.count, "error") %> prohibited this product from being saved:</h2>

      <ul>
        <% product.errors.full_messages.each do |message| %>
          <li><%= message %></li>
        <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div class="field">

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

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

rout.rb

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

products_controller.rb

class ProductsController < ApplicationController


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

  def edit
    @brand = @product.brand
  end 

   ...

    # Never trust parameters from the scary internet, only allow the white list through.
  def product_params
    params.require(:product).permit(:title, :brand_id)
  end
end

Я также добавил ссылку для создания продукта для данной марки

брендов / шоу. html .erb

<p id="notice"><%= notice %></p>

<p>
  <strong>Title:</strong>
  <%= @brand.title %>
</p>

<%= link_to 'Edit', edit_brand_path(@brand) %> |
<%= link_to 'Back', brands_path %> |
<%= link_to 'Create Products', new_product_path(brand_id: @brand.id) %>

Brand page

Create product Type and submit Success

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

При использовании вложенных маршрутов вам нужно будет написать

 form_with model: [@brand, @product]

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

Ваше действие new лучше всего изменить следующим образом:

def new 
  @brand = Brand.find(params[:brand_id)
  @product = @brand.products.build  
end 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...