【问题标题】:adding a method to non-restful routes in rails 4向 Rails 4 中的非休息路线添加方法
【发布时间】:2014-09-03 07:37:24
【问题描述】:

我想对我的一些路由执行操作,问题是它们不在“资源”块中,因为我需要为每个路由命名方法。我希望能够在索引类型视图中切换每个项目中每个属性的状态。我正在尝试合并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

搜索路线

                   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}}

【问题讨论】:

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


    【解决方案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
    

    【讨论】:

    • 是的,差不多就是这样。我昨晚破解了几个小时并破解了它,我将在下面发布。
    【解决方案2】:

    我必须了解成员和集合之间的区别。集合是附加到资源的路由(例如,restful 操作)。成员是可以在其块上执行操作的额外路由。

    这...

    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
    

    产生了这条 rake 路线

    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 的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 2011-05-28
      相关资源
      最近更新 更多