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