RAILS_ROOT_VIEW_PATH常量,如RAILS_ROOT?

时间:2011-01-13 16:17:29

标签: ruby-on-rails ruby view constants

以下SAT风格的类比是否有答案?

. : RAILS_ROOT :: ./app/views : ???

即路径app/views的Rails中是否有常量?

我问的原因是因为app/models/notifier.rb,我试图使用文件呈现电子邮件正文:

  def notify_fact_act(user, domain, filename)
    subject "Email with multipart/alternative & attachment"
    recipients user.email
    from "rails@example.com"
    content_type "multipart/mixed"

    file = File.join(view_paths.last, mailer_name, @template+'.text.')
    body = {:user => user, :domain => domain}
    part :content_type => "multipart/alternative" do |p|
      p.part :content_type => "text/plain",
        :body => render(:file => file + "plain.erb", :body => body)
      p.part :content_type => "text/html",
        :body => render(:file => file + "html.erb", :body => body)
    end

    attachment :content_type => "application/pdf",
      :body => File.read(filename),
      :filename => File.basename(filename)
  end

注意:我进行显式模板渲染的原因是ActionMailer::Base documentation状态,"如果已将任何附件或部件添加到电子邮件中,则不执行隐式模板渲染,&# 34;我正在添加PDF附件。

另外,从调试器中,我发现view_paths.last给了我想要的东西,但它似乎是可变的。我想要一些我知道每次都会有效的东西。

另外,从调试器中,我可以输入p instance_variables& p.local_variables,但我没有看到一个方法(在p puts methods.sort的输出中)用于打印出可用的常量。有吗?

2 个答案:

答案 0 :(得分:2)

简短的回答:不要这样做。

这就像在PATH环境变量中询问单个路径一样,实际上可能有很多路径。您应该使用Rails的内置render函数来执行任何需要处理视图文件的操作。仔细考虑为什么你需要知道这条路。您确定要这样做,还是只能使用render

答案 1 :(得分:0)

最简单的方法可能是创建一个基于Rails.root来解析路径的助手。如果在控制器中,则可以另外使用controller_pathparams[:controller]。使用引擎时,使用控制器路径将正确解析名称空间(假设视图和控制器文件夹使用相同的命名约定)。可以通过解析模型的Class名称来完成基于模型的解析,但是在使用名称空间时会涉及更多的问题。

def view_path
    Rails.root.join('app', 'views')
    # or
    # Rails.root.join('app', 'views', controller_path)
end