【问题标题】:rails 4 namespace :: folder structure models and controllersrails 4 namespace :: 文件夹结构模型和控制器
【发布时间】:2014-08-08 14:06:20
【问题描述】:

我当前的应用程序结构如下:

一个示例控制器如下所示:

class Api::V1::RegisterController < Api::V1::ApiController

  def create
    @user                  = ::V1::User.new(user_params)
    @user.email_address    = params[:email_address]
    @user.age_verification = params[:age_verification]
    @user.remote_addr      = request.env['REMOTE_ADDR']
    @user.web_browser      = browser.name.to_s + "(" + browser.version.to_s + ")"
    @user.operating_system = browser.platform.to_s

    if @user.save
      head status: 201
    else
      render_bad_request(@user.errors.messages)
    end
  end

  private

  def user_params
    params.permit(:email_address, :remote_addr, :web_browser, :operating_system, :age_verification)
  end

end

示例模型如下所示:

class V1::User < ActiveRecord::Base

  validates_presence_of :remote_addr, :web_browser,
                        :operating_system, :age_verification, :email_address

  validates :email_address, uniqueness:   { case_sensitive: false },
                            email_format: { check_mx: true }

end

我的主要问题是为什么我必须在我的模型前面使用::V1?有没有更好的方法解决这个问题或者我错过了什么?

【问题讨论】:

  • 当你使用没有V1的模型时它不起作用吗?因为它是常见的选项(使用没有版本的模型)。
  • @zishe 是的,我同意这应该可行……遗憾的是,它没有。我用 pry 验证了它。模型路径与控制器路径略有不同,所以我认为它无法推断出它在哪里。控制器 = 控制器/api/vi/name.rb 和模型 = 模型/v1/name.rb

标签: ruby-on-rails namespaces rails-api


【解决方案1】:

持续查找搜索当前模块范围,然后向上移动模块嵌套树。如果您只使用V1::User,那么RegisterController 中的代码将首先在Api::V1::RegisterController 中查找V1,然后,如果找不到,将向上移动到Api::V1,然后向上移动到Api,其中它找到了V1,所以它成功地找到了常量V1。但是Api::V1 不包含名为User 的常量(或者至少不是您想的那个)。将:: 放在前面会使常量搜索从模块命名空间的顶部开始,或多或少。

至于是否有更好的方法...也许您想将V1 的级别与Api 交换?然后会有一个顶级版本控制模块,V1::Api::WhateverController 可以在不指定版本的情况下找到User。如果这就是你想要达到的目标......

【讨论】:

【解决方案2】:

在本例中,::V1::Api::V1 是独立的模块对象。当您从 Api::V1::ApiController 内部引用 V1::User 时,ruby 将在 最近 V1 模块中查找 User。由于您已经在 API::V1 中,因此 ruby​​ 会尝试引用 ::Api::V1::User。当它找不到它时,ActiveSupport 的自动加载器会启动并在加载路径中的某处寻找api/v1/user.rb。由于不存在这样的文件,自动加载器无法找到 User 模型并抛出 NameError

【讨论】:

    猜你喜欢
    • 2012-03-29
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    相关资源
    最近更新 更多