一个小问题:
我正在使用Rails作为我的REST API,但由于它是一个RESTful API,因此我不需要:new
或:edit
路由来获取任何资源,因为人们只会进行交互完全通过自动JSON请求使用此API,而非图形化。例如,不需要专用的编辑页面。
目前,我需要为每个定义的资源执行类似的操作:
# routes.rb
resources :people, except: [:new, :edit]
在:except
中的每个资源上都有/config/routes.rb
个选项并不是什么大不了的事,但有没有办法定义默认值,所以我不必在每一种资源?我想稍微干掉这段代码,不要像在任何地方传递带有默认选项的局部变量一样蹩脚。
更一般地说,您可以为Rails路由设置默认选项,而不是:exclude
?
谢谢!
答案 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