Rails 路由:使用数据库字段的范围
Rails routing: Scope using a database field
我正在根据 Ryan Bigg 书中的想法创建一个多租户应用程序 "Multitenancy with Rails"。在这本书中,租户有自己的子域。这种方法不适用于我的情况,因此我尝试通过帐户名称的一部分来确定范围。
所以我想要 http://myapp.mydomain.com/account-name/
而不是像 http://account-name.myapp.com
这样的 URL。子域是为应用程序本身保留的,因为我希望能够在我的域中拥有多个应用程序。
这是我的 routes.rb:
scope module: 'accounts' do
resources :customers do
resources :notes
end
end
为了实现我的目标,我尝试按照 rubyonrails.com 上的路由指南(第 4.5 章中的最后一个代码片段),并将上面的代码更改为:
scope ':slug', module: 'accounts' do
resources :customers do
resources :notes
end
end
slug
是数据库中 accounts
table 中的一个属性,因此如果一个帐户被称为 "My Business",则 slug 通常是 "my-business".
此更改似乎更正了我的路线:
customers GET /:slug/customers(.:format)
.. 但它似乎也破坏了我的网站,因为 slug 不是从数据库中获取的。我似乎无法理解这个 scope':slug', module: 'accounts'
是如何工作的。 Rails 是否应该自动将 :slug 识别为帐户 table 的属性?如果没有,谁能帮我找到一种在我的 URL 中使用帐户别名的方法?
我已经用谷歌搜索了几天,并在 Whosebug 上阅读了大量答案。没有任何帮助,因此非常感谢任何指点。 :-)
编辑:
相关控制器设置如下:
controllers/accounts/base_controller.rb
controllers/accounts/customers_controller.rb
controllers/accounts/products_controlelr.rb
controllers/accounts_controller.rb
controllers/application_controller.rb
accounts_controller.rb此时只有新建和创建操作。
accounts/base_controller.rb 看起来像这样:
module Accounts
class BaseController < ApplicationController
before_action :authorize_user!
def current_account
@current_account ||= Account.find_by_slug(params[:slug])
end
...
end
end
我将此添加到我的帐户模型中:
def to_param
slug
end
在我尝试在我的路线中实施 scope ':slug'
之前,当登录用户定向到 myapp.mydomain.com/dashboard 并导航到即 myapp.mydomain.[ 时,一切正常。 =63=]。现在它适用于 myapp.mydomain.com/account-name/dashboard,但是当我尝试导航到使用像 new_customer_path
这样的助手的视图时,我收到错误:
没有路由匹配 {:action=>"show", :controller=>"accounts/customers", :id=>nil, :slug=>#
我希望这能让我的问题更清楚。 :-)
我不确定你的路由设置是否正确,因为你没有 post 你的控制器源代码,但如果非常简单,它基本上是如何工作的。如果您使用的是当前路由,您应该做的是在 controllers\account\
文件夹中创建一个 account_customers_controller.rb
文件,它应该如下所示:
class Accounts::CustomersController < ActionController::Base
def show
@account = Account.find_by_slug(params[:slug])
...
end
end
我正在根据 Ryan Bigg 书中的想法创建一个多租户应用程序 "Multitenancy with Rails"。在这本书中,租户有自己的子域。这种方法不适用于我的情况,因此我尝试通过帐户名称的一部分来确定范围。
所以我想要 http://myapp.mydomain.com/account-name/
而不是像 http://account-name.myapp.com
这样的 URL。子域是为应用程序本身保留的,因为我希望能够在我的域中拥有多个应用程序。
这是我的 routes.rb:
scope module: 'accounts' do
resources :customers do
resources :notes
end
end
为了实现我的目标,我尝试按照 rubyonrails.com 上的路由指南(第 4.5 章中的最后一个代码片段),并将上面的代码更改为:
scope ':slug', module: 'accounts' do
resources :customers do
resources :notes
end
end
slug
是数据库中 accounts
table 中的一个属性,因此如果一个帐户被称为 "My Business",则 slug 通常是 "my-business".
此更改似乎更正了我的路线:
customers GET /:slug/customers(.:format)
.. 但它似乎也破坏了我的网站,因为 slug 不是从数据库中获取的。我似乎无法理解这个 scope':slug', module: 'accounts'
是如何工作的。 Rails 是否应该自动将 :slug 识别为帐户 table 的属性?如果没有,谁能帮我找到一种在我的 URL 中使用帐户别名的方法?
我已经用谷歌搜索了几天,并在 Whosebug 上阅读了大量答案。没有任何帮助,因此非常感谢任何指点。 :-)
编辑:
相关控制器设置如下:
controllers/accounts/base_controller.rb
controllers/accounts/customers_controller.rb
controllers/accounts/products_controlelr.rb
controllers/accounts_controller.rb
controllers/application_controller.rb
accounts_controller.rb此时只有新建和创建操作。
accounts/base_controller.rb 看起来像这样:
module Accounts
class BaseController < ApplicationController
before_action :authorize_user!
def current_account
@current_account ||= Account.find_by_slug(params[:slug])
end
...
end
end
我将此添加到我的帐户模型中:
def to_param
slug
end
在我尝试在我的路线中实施 scope ':slug'
之前,当登录用户定向到 myapp.mydomain.com/dashboard 并导航到即 myapp.mydomain.[ 时,一切正常。 =63=]。现在它适用于 myapp.mydomain.com/account-name/dashboard,但是当我尝试导航到使用像 new_customer_path
这样的助手的视图时,我收到错误:
没有路由匹配 {:action=>"show", :controller=>"accounts/customers", :id=>nil, :slug=>#
我希望这能让我的问题更清楚。 :-)
我不确定你的路由设置是否正确,因为你没有 post 你的控制器源代码,但如果非常简单,它基本上是如何工作的。如果您使用的是当前路由,您应该做的是在 controllers\account\
文件夹中创建一个 account_customers_controller.rb
文件,它应该如下所示:
class Accounts::CustomersController < ActionController::Base
def show
@account = Account.find_by_slug(params[:slug])
...
end
end