在Rails中,是否可以在模块中命名空间模型,并仍然从url_for
获得正确的行为?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
?
UPDATE
于是,经过近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::User
以外,您还需要删除对模块M
的引用。
最后,这里的目标是命名空间模型,而不是视图和控制器。使用esads解决方案,模块M
(包含User
)被明确告知不会出现在路由中。因此,有效地,M
被剥离并且只剩下User
。
用户模型现在可以驻留在app/views/models/m/user.rb
中,用户控制器驻留在app/views/controllers/users_controller.rb
中,并且可以在app/views/users
中找到视图。
谢谢,我试过了,但它并没有解决问题:虽然url_for获取有关模型命名空间通知,路由(控制器)将适应于使用相同的命名空间 - 这不是我所需要的。 因此:是否可以设置路线以使用不同名称空间中的模型和控制器?换句话说,是否有一种方法可以影响url_for给定模型实例的行为,而不触及控制器路由? 例如,模型M :: User将在app/models/m/user.rb中定义,而控制器将在app/controllers/user_controller.rb中定义。 – sebastian 2010-12-12 18:31:45
另外,如果它不是RESTFul资源,你会怎么做?我有这个问题,我正在处理的控制器不能成为一个资源。 – Ibrahim 2010-12-24 03:39:47
资源:事情做(新行)得到“foo”=>“控制器#行动”。 – sethvargo 2010-12-25 17:06:01