【问题标题】:Rails routing: Scope using a database fieldRails 路由:使用数据库字段的范围
【发布时间】:2016-04-16 19:30:28
【问题描述】:

我正在根据 Ryan Bigg 的“Multitenancy with Rails”一书中的想法创建一个多租户应用程序。在本书中,租户有自己的子域。这种方法不适用于我的情况,因此我尝试通过帐户名称来确定范围。

所以我想要http://myapp.mydomain.com/account-name/,而不是像http://account-name.myapp.com 这样的URL。子域是为应用程序本身保留的,因为我希望能够在我的域中拥有多个应用程序。

这是我的路线.rb:

scope module: 'accounts' do
  resources :customers do
    resources :notes
  end
end

为了实现我的目标,我尝试按照rubyonrails.com上的路由指南(第4.5章中的最后一个代码sn-p),并将上面的代码更改为:

scope ':slug', module: 'accounts' do
  resources :customers do
    resources :notes
  end
end

slug 是数据库中accounts 表中的一个属性,因此如果一个帐户名为“我的企业”,则它通常是“我的企业”。

此更改似乎纠正了我的路线:

customers GET    /:slug/customers(.:format)  

.. 但它似乎也破坏了我的网站,因为没有从数据库中获取 slug。我似乎无法理解scope':slug', module: 'accounts' 的工作原理。 Rails 是否应该自动将 :slug 识别为 Account 表的属性?如果没有,谁能帮我找到在我的网址中使用该帐户的 slug 的方法?

我已经用谷歌搜索了几天,并在 Stackoverflow 上阅读了许多答案。没有任何帮助,因此非常感谢任何指针。 :-)

编辑:

相关的控制器是这样设置的:

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 此时只有 new 和 create 操作。

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.com/customers 时,一切都有效。现在它适用于 myapp.mydomain.com/account-name/dashboard,但是当我尝试导航到使用像 new_customer_path 这样的帮助器的视图时,我得到了错误:

没有路由匹配 {:action=>"show", :controller=>"accounts/customers", :id=>nil, :slug=>#

我希望这能让我的问题更清楚。 :-)

【问题讨论】:

  • 所以你想要一个看起来像http://myapp.mydomain.com/account-name/customers的网址?
  • 是的,“客户”是帐户模块中我的控制器的一个示例

标签: ruby-on-rails routing multi-tenant scoping


【解决方案1】:

我不确定您的路线是否设置正确,因为您没有发布控制器源代码,但如果非常简单,基本上它是如何工作的。如果您使用当前设置的路由,您应该在controllers\account\文件夹中创建一个account_customers_controller.rb 文件,它应该如下所示:

class Accounts::CustomersController < ActionController::Base
  def show
    @account = Account.find_by_slug(params[:slug])
    ...
  end
end

【讨论】:

  • 嗨,如果您觉得有帮助,请接受我的解决方案,或者如果您有问题,我可以提供更多帮助
  • 就是这样!!我还必须更新我的link_to,以便他们使用params[:slug] 的助手,但您的回答帮助我修复了我的accounts/base_controller.rb,如我问题的更新部分所示。谢谢你的帮助! :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2014-09-25
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多