Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails 4命名空间::文件夹结构模型和控制器_Ruby On Rails_Namespaces_Rails Api - Fatal编程技术网

Ruby on rails rails 4命名空间::文件夹结构模型和控制器

Ruby on rails rails 4命名空间::文件夹结构模型和控制器,ruby-on-rails,namespaces,rails-api,Ruby On Rails,Namespaces,Rails Api,我当前的应用程序结构如下所示: class V1::User < ActiveRecord::Base validates_presence_of :remote_addr, :web_browser, :operating_system, :age_verification, :email_address validates :email_address, uniqueness: { case_sensitive: fals

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

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

示例控制器如下所示:

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 Api::V1::RegisterController
示例模型如下所示:

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
classv1::User

我的主要问题这里是为什么我必须在我的模型前面使用
::V1
?有没有更好的方法来解决这个问题,还是我遗漏了什么

在本例中,
::V1
::Api::V1
是单独的模块对象。当您从
Api::V1::ApiController
内部引用
V1::User
时,ruby将在最近的
V1
模块中查找
User
。由于您已经在
API::V1
中,ruby然后尝试引用
::API::V1::User
。当它找不到它时,ActiveSupport的autoloader启动并在加载路径中的某个地方查找
api/v1/user.rb
。由于不存在此类文件,自动加载程序无法找到
用户
模型,并抛出
名称错误

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


至于是否有更好的方法。。。也许您想用
Api
交换
V1
的级别?然后将有一个顶级版本控制模块,并且
V1::Api::WhateverController
可以在不指定版本的情况下找到
User
。如果这就是您试图实现的目标……

当您使用不带
V1
的模型时,它是否不起作用?因为这是常见的选择(使用没有版本的模型)。@zishe是的,我同意这应该有效。。。可悲的是,事实并非如此。我用pry验证了它。模型路径与控制器路径略有不同,因此我认为它无法推断其位置。controllers=controllers/api/vi/name.rb和models=models/v1/name.rb有关ruby中常量查找的更多信息,请参阅。感谢您的发布。最后,我删除了版本化的模型,只使用了版本化的控制器。谢谢你的帮助。