2011-07-01 16 views
3

私はHAMLファイルを読み込み、その中から静的なhtmlファイルを作成するレーキタスクを作りたいと思っています。これは、ここで説明した方法でエラーページを動的にローカライズすることです。http://devcorner.mynewsdesk.com/2010/01/13/rails-i18n-and-404500-error-pages/Haml :: Engineでrailsメソッドを使用する

エラーページを書き込む方法は次のとおりです。

def write_error_page(status, locale = nil) 
    dest_filename = [status.to_s, locale, "html"].compact.join(".") 
    File.open(File.join(Rails.root, "public", dest_filename), "w") do |file| 
    path = File.join(Rails.root, "app", "views", "errors", "#{status}.haml") 
    file.print Haml::Engine.new(File.read(path)).render 
    end 
end 

問題は、Haml :: Engineに利用できるrailsメソッドがないことです。だから、hamlファイルを読み込もうとすると、ファイルのすべてのrailsメソッドにエラーが発生します(image_tag、form_for、明らかにI18n.translateのようなメソッド を使いたい)。

私はここで解決されていた同様の問題に気づい:#は、「未定義のローカル変数やメソッドの `config」:私は上記のリンクに記載されたソリューションをしようとしたとき、私は次のエラーを取得する、しかしRails HAML engine rendering

を"

私はHAMLファイルを読むことができるように、Haml :: Engineでレールメソッドを動作させるにはどうすればよいですか?私もERBに切り替えようとしましたが、他の誰かがここで少なくとも部分的に解決したのと同じ問題につながることに気付いたrender erb from database into view problem please help!しかし、この解決法も私には役に立たなかった。

私はHaml :: Engineを使用するよりも他のソリューションにもオープンしています。私はcapture_hamlヘルパーを見たが、それが私にどちらの助けになるか見ていない。

答えて

0

私はこの状況ではHaml :: Engineは必要ないと分かりました。私はレール環境にいるので、レンダリングを呼び出すことができます。愚かな私。

しかし、私たちがコントローラやビューにないので、レーキタスクからレンダリングを呼び出すことは、まったく自明ではありません(そして、純粋主義者はあなたがそうしてはいけないと言っていますが、この場合は私がここで使用したコードを投稿します(私はここで言及したアプローチを使用しました:http://wholemeal.co.nz/blog/2011/04/05/rendering-from-a-model-in-rails-3/)。

def write_error_page(status, locale = nil) 
    dest_filename = [status.to_s, locale, "html"].compact.join(".") 
    File.open(File.join(Rails.root, "public", dest_filename), "w") do |file| 
    path = File.join("app", "views", "errors", "#{status}.haml") 
    file.print ActionView::Base.new(Rails.configuration.paths.app.views.first).render(:file => path) 
    end 
end 

このアプローチにもいくつか問題がありました。たとえば、form_forはまだ正常に動作しませんでした(私はエラーページにフィードバックフォームがあります)ので、単純なHTML(これは幸いなことに.hamlファイルに直接挿入できます)でフォームを作成しました。しかし、私が.hamlテンプレート(I18n.translateメソッド)で働くために必要としたレールの1つは、魅力のように機能します。

+0

これを使用しようとしていますが、Rails.configuration.paths.app.views.firstは、#のための未定義のメソッド 'app 'をエラーしています。 – tbem

+0

代わりに私は解決しました:Rails.configuration.paths ["app/views"]。最初 – tbem

+0

他の問題は、私はヘルパーメソッドにアクセスすることはできません、どうすればそれを注入できますか? – tbem

0

あなたのrakeタスクの:environment依存を行う必要があります。

task :some_task => :environment do 
    # stuff here 
end 

これはRailsのをロードします。それはロードされていないように聞こえる。

+0

いや、それはできません。私はこのレーキタスクからwrite_error_pagesメソッドを呼び出します: タスク:write_error_pages =>:環境do ... end 私は、write_error_pageメソッドでは使用していますが、Haml :: Engineはレールに依存せずにHamlを使用する方法なので、Haml :: Engineでは使用できません。そういう意味では、行くのが間違った方法のように聞こえるが、私はこれを行うための他の方法を考え出すことはできない。 – Kusti

0

ビューのパスのためにあなたのものが私のために働かなくなったとき、そして私のアプリケーションヘルパーからいくつかの関数を含める必要があったので、私はあなたに基づいてこの解決策をとった。私はあなたがこの含めてのform_for問題を解決することができると思う:ActionView::Base.send :include, ActionView::Helpers::FormHelper

それは私が必要なものだったので、私は、HTMLにフォーマットを変更...

def to_html 
    ActionView::Base.send :include, ActionView::Helpers::ApplicationHelper 

    File.open(File.join(Rails.root, "public", 'test.html'), "w") do |file| 

    file.print ActionView::Base.new(Rails.configuration.paths["app/views"].first).render(
       :partial => 'partial_folder/partial', 
       :format => :html, 
       :locals => { :model => self} 
      ) 
    end 
end 
関連する問題