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_pathurl_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。