Одноименные контроллеры, один для администраторов, один для пользователей. админ продолжает маршрутизацию к пользователю. Как исправить? - PullRequest
0 голосов
/ 12 января 2019

Я создаю простой магазин, у меня одна таблица товаров. Я хочу, чтобы любой, кто заходил в магазин по адресу «сайт / продукты», мог только «показывать» продукты. но на URL 'website / admins / products' я хочу создавать, редактировать, уничтожать.

У меня есть два контроллера с одинаковым именем 'product_controller'. один находится в 'controller / admin', другой - просто в 'controller'. у контроллера администратора есть полный CRUD, в то время как у другого контроллера только показ.

Моя проблема в том, что я всегда перенаправлен на один и тот же контроллер («website / admins / products» отправляет меня на «controller / product_controller»)

Я не уверен, что проблема в моем файле маршрута или в моей форме (или что-то еще?)

Это моя форма, которая идентична для обоих

    <%= 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 :description %>                                                            
     <%= form.text_area :description %>                                                          
    </div>                                                                                      

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

    <div class="field">                                                                         
      <%= form.label :inventory_count %>                                                        
      <%= form.number_field :inventory_count %>                                                 
    </div>                                                                                      

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

А это мой маршрутный файл

 Rails.application.routes.draw do                                                               

   namespace :admin do                                                                          
     resources :products                                                                        
   end                                                                                                                        

   resources :products  
 end  

Добавлено:

Контроллеры / products_controller

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

  def index
    @products = Product.all
  end

  def show
  end

  def update
    respond_to do |format|
      if @product.ipdate(product_params)
        format.html {redirect_to @product, notice: 'product was successfully updated.' }
      else
        format.json {render :edit }
        format.json {render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

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

    def product_params
      params.require(:product).permit(:title, :description, :price, :inventory_count)
    end
end

Контроллеры / админ / products_controller

class Admin::ProductsController < ApplicationController 
  before_action :set_product, only: [:show, :edit, :update, :destroy]

  def index
    @products = Product.all
  end

  def show
  end

  def new
    @product = Product.new
  end

  def create
    @product = Product.new(product_params)
    respond_to do |format|
      if @product.save 
        format.html { redirect_to @product, notice: 'Product was successfully created.' }
        format.json { render :show, status: :created, location: @product }
      else
        format.html { render :new }
        format.json { render json: @product.errors, status: :unprocessable_entity } 
      end
    end 
  end

  def update
    respond_to do |format|
      if @product.ipdate(product_params)
        format.html {redirect_to @product, notice: 'product was successfully updated.' }
      else
        format.json {render :edit }
        format.json {render json: @product.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @product.destroy
    respond_to do |format|
      format.html {redirect_to products_url, notice: 'Product was successfully destroyed.' }
      format.json {head :no_content }
    end
  end


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

    def product_params
      params.require(:product).permit(:title, :description, :price, :inventory_count)
    end
end

Обновление: просмотр index.html.erb 24 <p id="notice"><%= notice %></p> 23 22 <h1>Products</h1> 21 20 <table> 19 <thead> 18 <tr> 17 <th>Title</th> 16 <th>Description</th> 15 <th>Price</th> 14 <th>Inventory count</th> 13 <th colspan="3"></th> 12 </tr> 11 </thead> 10 9 <tbody> 8 <% @products.each do |product| %> 7 <tr> 6 <td><%= product.title %></td> 5 <td><%= product.description %></td> 4 <td><%= product.price %></td> 3 <td><%= product.inventory_count %></td> 2 <td><%= link_to 'Show', product %></td> 1 <td><%= link_to 'Edit', edit_admin_product_path(product) %></td> 25 <td><%= link_to 'Destroy', product, method: :delete, data: { confirm: 'Are you sure?' } %></td> 1 </tr> 2 <% end %> 3 </tbody> 4 </table> 5 6 <br> 7 8 <%= link_to 'New Product', new_admin_product_path %>

Если у вас есть какие-либо мысли или предложения, я был бы очень признателен, спасибо!

1 Ответ

0 голосов
/ 12 января 2019

Маршруты не являются проблемой, если вы запускаете маршруты rails с этим кодом, вы можете увидеть что-то вроде:

    admin_products GET    /admin/products(.:format)          admin/products#index
                   POST   /admin/products(.:format)          admin/products#create
 new_admin_product GET    /admin/products/new(.:format)      admin/products#new
edit_admin_product GET    /admin/products/:id/edit(.:format) admin/products#edit
     admin_product GET    /admin/products/:id(.:format)      admin/products#show
                   PATCH  /admin/products/:id(.:format)      admin/products#update
                   PUT    /admin/products/:id(.:format)      admin/products#update
                   DELETE /admin/products/:id(.:format)      admin/products#destroy
          products GET    /products(.:format)                products#index
                   POST   /products(.:format)                products#create
       new_product GET    /products/new(.:format)            products#new
      edit_product GET    /products/:id/edit(.:format)       products#edit
           product GET    /products/:id(.:format)            products#show
                   PATCH  /products/:id(.:format)            products#update
                   PUT    /products/:id(.:format)            products#update
                   DELETE /products/:id(.:format)            products#destroy

Если вы хотите использовать разные контроллеры, вам нужны две формы, которые генерируют маршруты к этим контроллерам соответственно

<%= form_with scope: :product, url: product_path(@product), method: :patch do |form| %>
  ...
<% end %>

Для администратора

<%= form_with scope: :product, url: admin_product_path(@product), method: :patch do |form| %>
  ...
<% end %>

Обновление

Для новых продуктов

<%= form_with scope: :product, url: products_path do |form| %>
  ...
<% end %>

<%= form_with scope: :product, url: admin_products_path do |form| %>
  ...
<% end %>

Справочник по API https://api.rubyonrails.org/v5.1/classes/ActionView/Helpers/FormHelper.html#method-i-form_with

...