0

Прошло некоторое время с тех пор, как я работал в Rails, и у меня возникли проблемы с настройкой моих маршрутов должным образом. Любая помощь будет принята с благодарностью.Ruby on Rails неопределенный метод `products_path 'routing issue

URL: http://localhost:3000/admin/products/new 

Error: undefined method `products_path' for #<#<Class:0x007f9f569d0150>:0x007f9f578ccb18> 

рейк маршруты

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 
        PUT /admin/products/:id(.:format)  admin/products#update 
        DELETE /admin/products/:id(.:format)  admin/products#destroy 

routes.rb

Aneprize::Application.routes.draw do 
    devise_for :admins, :users 

    namespace :admin do 
    match '/', to: 'dashboard#index', as: '/' 

    authenticated :admin do 
     root to: 'dashboard#index', as: :root 

     resources :products do 
     resource :contest 
     resources :bids 
     resources :photos 
     resources :tags 
     end 
    end 
    end 

    root to: 'contests#index' 
end 

product.rb

class Product < ActiveRecord::Base 
    attr_accessible :name, :retail_price, :short_description, :long_description, :weight 

    has_one :contest, dependent: :destroy 
    has_many :photos, dependent: :destroy 
    has_many :bids, dependent: :destroy 
    has_many :tags 

    validates :name, :short_description, :long_description, presence: true 
    validates :retail_price, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 0 } 
    validates :weight, presence: true, numericality: { only_integer: true, greater_than_or_equal_to: 1 } 
end 

contest.rb

class Contest < ActiveRecord::Base 
    attr_accessible :product_id, :duration 

    belongs_to :product, dependent: :destroy 

    validates :product_id, presence: true, numericality: { only_integer: true, greater_than: 0 } 
    validates :duration, presence: true, numericality: { only_integer: true, greater_than: 2 } 
end 

product.rb

class Photo < ActiveRecord::Base 
    attr_accessible :product_id, :image_url 

    belongs_to :product 

    validates :product_id, presence: true, numericality: { only_integer: true, greater_than: 0 } 
    validates :image_url, presence: true, format: { with: /^[^-\d].+/ } 
end 

bid.rb

class Bid < ActiveRecord::Base 
    attr_accessible :product_id, :account_id, :amount 

    belongs_to :account 
    belongs_to :product, dependent: :destroy 

    validates :account_id, :product_id, :amount, presence: true, numericality: { only_integer: true, greater_than: 0 } 
end 

tag.rb

class Tag < ActiveRecord::Base 
    attr_accessible :name, :product_id 

    belongs_to :product 

    validates :name, presence: true, format: { with: /^\D+$/ } 
    validates :product_id, presence: true, numericality: { only_integer: true, greater_than: 0 } 
end 
+1

Run 'грабли routes', чтобы увидеть все маршруты. Фактически, маршрут должен быть как 'admin_products_path', поскольку у вас есть пространство имен: admin' –

+0

Сергей, идущие рейковые маршруты дают мне следующее: new_admin_product GET /admin/products/new(.:format) admin/products # new –

+0

У вас есть 'admin_products', если вы видите. Это то, что вам нужно. Попробуйте iy out с '<% = link_to" Продукты для администратора ", admin_products_path%>' –

ответ

3

По мере возникновения ошибки в URL: http://localhost:3000/admin/products/new у вас возникнут проблемы с построителем формы.

Хотя у вас есть ресурсы продуктов в пространстве имен :admin, вы должны учитывать этот факт во время создания формы. Правильный пример:

<%= form_for [:admin, @product] do |f| %> 
    ... # whatever 
<% end %> 

вместо того, чтобы просто

<%= form_for @product do |f| %> 
    ... # whatever 
<% end %> 
+0

Wow. Теперь я даже не знал. Я не могу вас поблагодарить! Я также поддержал ответ, чтобы дать кредит там, где это необходимо. Еще раз спасибо!!!! –

+0

Я рад помочь вам –

+0

вам также может понадобиться ', url: admin_product_path (resource)' –

0

Где-то в новом шаблоне вы звоните products_path. Поскольку он находится под управлением администратора, вы должны изменить его на admin_products_path

+0

Эй, Джош, у меня это в admin/dashboard/index.html.haml: = link_to "Добавить товар", new_admin_product_path (@product) –