0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

namespeceの重複【::】

Last updated at Posted at 2022-04-23

名前空間の重複

名前空間の重なりにより、undefind method newのエラーが出たのでその忘備録。

エラー箇所

routes.rb
Rails.application.routes.draw do
  namespace :api, format: 'json' do
    namespace :v1 do
      resources :articles, only: %i[index show]
      namespace :user do
        resources :articles, only: %i[index create update destroy]
      end
      post 'authentication', to: 'authentication#create'
      post 'registration', to: 'registration#create'
    end
  end
end
api/v1/registration_controller.rb
# 一部抜粋
def create
 @user = User.new(user_params) #⬅️ここでエラー発生
 if @user.save
  json_string = UserSerializer.new(@user).serialized_json
  set_access_token!(@user)
  render json: json_string
 else
  render400(nil, @user.errors.full_messages)
 end
end

恐らくnamespaceuserも加わり、railsがどこのuserを呼び出しているのか分からなくなり、newメソッドが呼び出せなくなったと思われる。

そこでこのUserに絶対位置を指定することによってこのエラーは解決された。

Userに絶対位置を指定

api/v1/registration_controller.rb
# 一部抜粋
def create
 @user = ::User.new(user_params) #⬅️ここ
 if @user.save
  json_string = UserSerializer.new(@user).serialized_json
  set_access_token!(@user)
  render json: json_string
 else
  render400(nil, @user.errors.full_messages)
 end
end

絶対位置の指定は上記の通り、::(ダブルコロン)を先頭につけるだけで解決した。

::から始まる場合は一番上位の階層レベルを指すため、module内などで使う場合にモジュールの絶対的な位置を表現することができる。

この記事でわかりやすく解説している。

上記記事から抜粋
ClassAは相対指定、::ClassAは絶対指定
・絶対指定は、トップレベルを指す
::ClassAObject::ClassAは同じ挙動になる

参考記事

Rubyでクラス名のはじめに::(コロンを2つ)をつけるとそのクラスの絶対的な位置表現をすることができる)
Ruby: クラス名の先頭につける :: (先頭二重コロン) は何?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?