Rails资源路由的默认:exclude选项

8

一个小问题:

我正在使用Rails开发REST API,但由于它是一个RESTful API,我不需要为任何资源添加:new:edit路由,因为人们只会通过自动化的JSON请求完全地与这个API进行交互,而不是通过图形界面。例如,没有必要专门创建一个编辑页面。

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

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

/config/routes.rb中,在每个资源上拥有:except选项并不是什么大问题,但是否有一种方法可以定义默认值,以便我不必在每个资源上指定这个选项?我想让这段代码更加DRY,而不是像通过传递带有默认选项的本地变量这样的愚蠢方式。

更一般地说,除了:exclude之外,你能为Rails路由设置默认选项吗?

谢谢!

3个回答

13

with_options用于救援!

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

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方法。

0

我会使用CanCan宝石。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接