小编poo*_*nza的帖子

在加载*路由后运行*的Rails初始化程序?

我想在我的Rails应用程序启动时设置一个类属性.它需要检查一些路由,因此需要在我的自定义代码运行之前加载路由.我无法找到一个可靠的地方.

这在"测试"环境中完美地工作:

config.after_initialize do
  Rails.logger.info "#{Rails.application.routes.routes.map(&:path)}"
end
Run Code Online (Sandbox Code Playgroud)

但它并没有在"发展"的环境中工作(路线是空的)

现在,我似乎通过运行config.to_prepare我理解在每个请求之前发生的相同代码,让事情在开发模式下工作.不幸的是,to_prepare单独使用似乎不能在测试模式下工作,因此重复.

我很好奇为什么在测试模式中after_initialize之前加载路由,而不是在开发模式下.真的,最好的钩子是什么?是否有一个适用于所有环境的钩子?

*编辑*

穆的建议重新加载路线很棒.它使我能够在所有环境中对after_initialize内的路径进行一致的访问.但是对于我的用例,我认为我仍然需要运行to_prepare中的代码,因为我在模型上设置了一个类属性,并且在每个请求之前重新加载模型.

所以这就是我最终做的事情.

[:after_initialize, :to_prepare].each do |hook|
  config.send(hook) do
    User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
  end 
end 
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎有些混乱.我想我宁愿这样做:

config.after_initialize do
  User.exclude_routes_from_usernames!
end

config.to_prepare do
  User.exclude_routes_from_usernames!
end
Run Code Online (Sandbox Code Playgroud)

但我不确定是否User适合进行检查Rails.application.routes.我想我可以用lib /中的代码做同样的事情,但我不确定这是否正确.

另一个选择是在to_prepare上应用mu的建议.这样可行,但是在我的开发环境中每次请求都重新加载路由似乎有明显的延迟,所以我不确定这是否是一个好的呼叫,尽管它至少是干的.

config.to_prepare do
  Rails.application.reload_routes!
  User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
end
Run Code Online (Sandbox Code Playgroud)

routes ruby-on-rails initializer ruby-on-rails-3 ruby-on-rails-3.1

18
推荐指数
1
解决办法
6630
查看次数

在Rails中初始化class_attribute的正确方法是什么?

class_attribute在Rails中初始化a的正确方法是什么?

我用这个:

class Foo < ActiveRecord::Base

  class_attribute :foobar
  self.foobar = []

  # ...

end
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常,但似乎对我来说看起来有点非Railsy.

ruby-on-rails ruby-on-rails-3

14
推荐指数
2
解决办法
4323
查看次数

Rails验证以确保用户名不会与现有路由冲突?

我想确保用户无法创建与我现有路由冲突的用户名.我也希望能够拒绝我可能定义的未来路线.我想要完成这样的事情:

在模型中:

class User < ActiveRecord::Base
  @@invalid_usernames = %w()

  cattr_accessor :invalid_usernames

  validates :username, :exclusion { :in => @@invalid_usernames }
end
Run Code Online (Sandbox Code Playgroud)

在一些初始化程序中:

User.invalid_usernames += Rails.application.routes.routes.map(&:path).join("\n").scan(/\s\/(\w+)/).flatten.compact.uniq
Run Code Online (Sandbox Code Playgroud)

这是"Rails方式"吗?有没有更好的办法?

validation activerecord ruby-on-rails activemodel ruby-on-rails-3

7
推荐指数
1
解决办法
538
查看次数