默认值:Rails资源路由的排除选项

时间:2014-10-28 18:40:47

标签: ruby-on-rails ruby ruby-on-rails-4 routing routes

一个小问题:

我正在使用Rails作为我的REST API,但由于它是一个RESTful API,因此我不需要:new:edit路由来获取任何资源,因为人们只会进行交互完全通过自动JSON请求使用此API,而非图形化。例如,不需要专用的编辑页面。

目前,我需要为每个定义的资源执行类似的操作:

# routes.rb
resources :people, except: [:new, :edit]

:except中的每个资源上都有/config/routes.rb个选项并不是什么大不了的事,但有没有办法定义默认值,所以我不必在每一种资源?我想稍微干掉这段代码,不要像在任何地方传递带有默认选项的局部变量一样蹩脚。

更一般地说,您可以为Rails路由设置默认选项,而不是:exclude

谢谢!

3 个答案:

答案 0 :(得分:9)

with_options救援!

with_options(except: [:new, :edit]) do |opt|
  opt.resource :session
  opt.resource :another_resource
  opt.resources :people
end

答案 1 :(得分:1)

您可以定义一个自定义方法来在ActionDispatch::Routing::Mapper命名空间下绘制路线。在routes.rb文件中,位于Rails.application.routes.draw do之前的文件顶部:

class ActionDispatch::Routing::Mapper

  def draw(resource)
    resources resource, except: [:new, :edit]
  end

end

#routes start here
Rails.application.routes.draw do

  draw :people
  draw :products
  # ...rest of the routes

end

现在,对于这些特定资源,您可以按上述方式调用draw方法。

答案 2 :(得分:0)

我会实现CanCan gem。

您可以简化对单个文件的资源访问

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end
end

然后在您的控制器中,您可以使用一行强制执行资源

class CustomersController < ApplicationController
    load_and_authorize_resource
    ...
end

定义能力 https://github.com/ryanb/cancan/wiki/Defining-Abilities

在控制器级授权 https://github.com/ryanb/cancan/wiki/authorizing-controller-actions