在rails 4中为非restful路由添加方法

时间:2014-07-13 01:12:16

标签: ruby-on-rails model-view-controller ruby-on-rails-4 routing

我想对我的一些路线执行操作,问题是它们不在“资源”块中,因为我需要为每个路径命名方法。我希望能够在索引类型视图中切换每个项目中每个属性的状态。我试图合并this教程。

  devise_for :admins  # The priority is based upon order of creation: first created -> highest priority.
  root 'home#index'
  resources :entries, :only => [:index, :new, :create] 
  namespace :admin do 
    namespace :entries do
      match :pending, :via => [:get, :post], :collection => { :toggle_approve => :put}
      match :rejected, :via => [:get, :post], :collection => { :toggle_approve => :put}
      match :approved, :via => [:get, :post], :collection => { :toggle_approve => :put}
    end
  end

条目控制器

class Admin::EntriesController < ApplicationController

  expose(:entries){@entries}


  def index
  end

  def show
  end

  def approved 
    @entries = Photo.with_approved_state
  end

  def pending
    @entries = Photo.with_pending_state 
  end

  def rejected
    @entries = Photo.with_rejected_state
  end

  def toggle_approve  
    @a = Photo.find(params[:id])  
    @a.toggle!(:workflow_state)  
    render :nothing => true  
  end

rake routes

                   Prefix Verb     URI Pattern                       Controller#Action
        new_admin_session GET      /admins/sign_in(.:format)         devise/sessions#new
            admin_session POST     /admins/sign_in(.:format)         devise/sessions#create
    destroy_admin_session DELETE   /admins/sign_out(.:format)        devise/sessions#destroy
           admin_password POST     /admins/password(.:format)        devise/passwords#create
       new_admin_password GET      /admins/password/new(.:format)    devise/passwords#new
      edit_admin_password GET      /admins/password/edit(.:format)   devise/passwords#edit
                          PATCH    /admins/password(.:format)        devise/passwords#update
                          PUT      /admins/password(.:format)        devise/passwords#update
cancel_admin_registration GET      /admins/cancel(.:format)          devise/registrations#cancel
       admin_registration POST     /admins(.:format)                 devise/registrations#create
   new_admin_registration GET      /admins/sign_up(.:format)         devise/registrations#new
  edit_admin_registration GET      /admins/edit(.:format)            devise/registrations#edit
                          PATCH    /admins(.:format)                 devise/registrations#update
                          PUT      /admins(.:format)                 devise/registrations#update
                          DELETE   /admins(.:format)                 devise/registrations#destroy
                     root GET      /                                 home#index
                  entries GET      /entries(.:format)                entries#index
                          POST     /entries(.:format)                entries#create
                new_entry GET      /entries/new(.:format)            entries#new
    admin_entries_pending GET|POST /admin/entries/pending(.:format)  admin/entries#pending {:collection=>{:toggle_approve_article=>:put}}
   admin_entries_rejected GET|POST /admin/entries/rejected(.:format) admin/entries#rejected {:collection=>{:toggle_approve_article=>:put}}
   admin_entries_approved GET|POST /admin/entries/approved(.:format) admin/entries#approved {:collection=>{:toggle_approve_article=>:put}}

2 个答案:

答案 0 :(得分:1)

我不知道collection选项的来源(我在任何地方都找不到对它的引用)

实施非资源丰富的路线实际上相对简单:

#config/routes.rb
resources :entries, only: [:index, :new, :create] do
    collection do
       match :pending, via: [:get, :post]  #-> domain.com/entries/pending
       match :rejected, via: [:get, :post] #-> domain.com/entries/rejected
       match :approved, via: [:get, :post] #-> domain.com/entries/approved
    end
end

我不理解collection选项 - 我认为这不属于您的路线。虽然已经考虑过了,但我想你是想尝试做到这一点,如果你收到domain.com/entries/toggle_approve_article/pending的请求,你会想要处理这个问题吗?

如果是这样,为什么不这样做:

#config/routes.rb
resources :entries, only: [:index, :new, :create] do
    put :toggle_approve #-> domain.com/entries/15/toggle_approve
    collection do
       match :pending, via: [:get, :post]  #-> domain.com/entries/pending
       match :rejected, via: [:get, :post] #-> domain.com/entries/rejected
       match :approved, via: [:get, :post] #-> domain.com/entries/approved
    end
end

答案 1 :(得分:0)

我必须了解成员和馆藏之间的区别。集合是资源之外的路由(例如,宁静的动作)。成员是可以对其块执行操作的额外路由。

此...

resources :entries, :only => [:index, :new, :create]
  namespace :admin do
    resources :entries do
      get :pending, on: :collection
      get :approved, on: :collection
      get :rejected, on: :collection
      member do 
        get :toggle_approve_field
        get :toggle_reject_field
      end
    end 
  end

产生了这种佣金路线

entries GET    /entries(.:format)                                entries#index
                                 POST   /entries(.:format)                                entries#create
                       new_entry GET    /entries/new(.:format)                            entries#new
           pending_admin_entries GET    /admin/entries/pending(.:format)                  admin/entries#pending
          approved_admin_entries GET    /admin/entries/approved(.:format)                 admin/entries#approved
          rejected_admin_entries GET    /admin/entries/rejected(.:format)                 admin/entries#rejected
toggle_approve_field_admin_entry GET    /admin/entries/:id/toggle_approve_field(.:format) admin/entries#toggle_approve_field
 toggle_reject_field_admin_entry GET    /admin/entries/:id/toggle_reject_field(.:format)  admin/entries#toggle_reject_field
                   admin_entries GET    /admin/entries(.:format)                          admin/entries#index
                                 POST   /admin/entries(.:format)                          admin/entries#create
                 new_admin_entry GET    /admin/entries/new(.:format)                      admin/entries#new
                edit_admin_entry GET    /admin/entries/:id/edit(.:format)                 admin/entries#edit
                     admin_entry GET    /admin/entries/:id(.:format)                      admin/entries#show
                                 PATCH  /admin/entries/:id(.:format)                      admin/entries#update
                                 PUT    /admin/entries/:id(.:format)                      admin/entries#update
                                 DELETE /admin/entries/:id(.:format)                      admin/entries#destroy

我花了很多时间,并且我不确定我是否能够在没有更多头痛的情况下按要求进行此操作但我当然更好地了解了所有的rails路由。感谢@RichPeck的帮助