以下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
的输出中)用于打印出可用的常量。有吗?
答案 0 :(得分:2)
简短的回答:不要这样做。
这就像在PATH
环境变量中询问单个路径一样,实际上可能有很多路径。您应该使用Rails的内置render
函数来执行任何需要处理视图文件的操作。仔细考虑为什么你需要知道这条路。您确定要这样做,还是只能使用render
?
答案 1 :(得分:0)
最简单的方法可能是创建一个基于Rails.root
来解析路径的助手。如果在控制器中,则可以另外使用controller_path
或params[:controller]
。使用引擎时,使用控制器路径将正确解析名称空间(假设视图和控制器文件夹使用相同的命名约定)。可以通过解析模型的Class名称来完成基于模型的解析,但是在使用名称空间时会涉及更多的问题。
def view_path
Rails.root.join('app', 'views')
# or
# Rails.root.join('app', 'views', controller_path)
end