Rails では、モジュール内のモデルに名前を付けてから正しい動作を取得することは可能url_for
ですか?
たとえば、ここでurl_for
は期待どおりに動作します。
# app/models/user.rb
class User < ActiveRecord::Base
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # /users/1
User
モデルをモジュールに入れた後url_for
、未定義のメソッドについて不平を言うm_user_path
:
# app/models/m/user.rb
module M
class User < ActiveRecord::Base
end
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # undefined method 'm_users_path'
url_for
モジュールを無視して代わりにM::User
返すことは可能ですか?user_path
url_for(@user)
m_user_path
アップデート
それで、ほぼ5年後、esadのおかげで解決策がここにあります. これは Rails 4.2 でテスト済みです。
# app/models/m/user.rb
module M
class User < ActiveRecord::Base
end
end
# app/models/m.rb
module M
def self.use_relative_model_naming?
true
end
def self.table_name_prefix
'm_'
end
end
# config/routes.rb
resources :users
# app/views/users/index.html.haml
= url_for(@user) # /users/1
注: を使用してモデル、ビュー、およびコントローラーを生成する場合、ビューとbin/rails g scaffold m/user
コントローラーにも名前空間が付けられます。app/views/m/users
に移動する必要がapp/views/users
ありapp/controllers/m/users_controller.rb
ますapp/controllers/users_controller.rb
。M
また、モデル以外のすべてのモジュールへの参照を削除する必要がありますM::User
。
最後に、ここでの目標は名前空間モデルであり、ビューとコントローラーではありません。esads ソリューションでは、モジュールM
(を含むUser
) はルートに表示されないように明示的に指示されます。したがって、事実上、M
は取り除かれ、User
残るだけになります。
ユーザーモデルは に常駐できapp/views/models/m/user.rb
、ユーザーコントローラーは にapp/views/controllers/users_controller.rb
あり、ビューは にありますapp/views/users
。