RAILS_ROOT_VIEW_PATH Константа, как RAILS_ROOT? - PullRequest
0 голосов
/ 13 января 2011

Есть ли ответ на следующую аналогию в стиле SAT?

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

Т.е. есть ли в Rails константа для пути app/views?

Причина, по которой яЯ спрашиваю, потому что из 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:: Базовая документация гласит: «Неявное отображение шаблона не выполняется, если в электронное письмо были добавлены какие-либо вложения или части», и я добавляю вложение в формате PDF.

Также из отладчика,Я обнаружил, что view_paths.last дает мне то, что я хочу, но кажется переменным.Я хочу, чтобы какая-то константа, которую я знаю, работала каждый раз.

Кроме того, из отладчика я могу набрать p instance_variables & p.local_variables, но я не вижу метода (в выводе p puts methods.sort) для распечатки доступных констант.Есть ли один?

Ответы [ 2 ]

2 голосов
/ 13 января 2011

Краткий ответ: не делайте этого.

Это все равно, что запросить единственный путь в переменной среды PATH, когда в действительности в нем, вероятно, много путей.Вы должны использовать встроенную в Rails функцию render, чтобы делать все, что нужно для просмотра файлов.Тщательно продумайте, почему вам нужно знать этот путь.Вы уверены, что вы делаете, или вы можете просто использовать render?

0 голосов
/ 14 мая 2019

Возможно, проще всего создать помощника, который разрешает путь на основе Rails.root.Если в контроллере можно дополнительно использовать controller_path или params[:controller].Использование пути контроллера правильно разрешит пространства имен при использовании механизмов (при условии, что представление и папка контроллера используют одинаковые соглашения об именах).Разрешение на основе модели может быть выполнено путем анализа имени класса модели, но это будет более сложным при использовании пространств имен.

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