7

Rails 3.2アプリでは、ファイルにjavascript_include_tagを含める前に、アセットパイプラインにjavascriptファイルが存在するかどうかを確認したいと思います。何かのようなもの:

<% if javascript_file_exists? %>
  <%= javascript_include_tag "#{controller_name}_controller" %>
<% end %>

javascriptファイルがなくてもエラーが発生しないように、これを実行したいと思います。これを行う方法はありますか?

4

6 に答える 6

18

より Rails な方法は、ヘルパーを使用することです。これにより、ファイルの coffeescript または javascript バージョンを確認できます。

def javascript_exists?(script)
  script = "#{Rails.root}/app/assets/javascripts/#{params[:controller]}.js"
  File.exists?(script) || File.exists?("#{script}.coffee") 
end

次に、レイアウトで使用できます。

<%= javascript_include_tag params[:controller], :media => "all"  if javascript_exists?(params[:controller]) %>

CSS で同じことができます。

 -- helper --
 def stylesheet_exists?(stylesheet)
   stylesheet = "#{Rails.root}/app/assets/stylesheets/#{params[:controller]}.css"
   File.exists?(stylesheet) || File.exists?("#{stylesheet}.scss") 
 end

 -- layout --
 <%= stylesheet_link_tag params[:controller], :media => "all"  if stylesheet_exists?(params[:controller]) %>


編集: #javascript_exists を更新しましたか?

最近、javascript_exists?ヘルパーにいくつかの変更を加えました。

def javascript_exists?(script)
  script = "#{Rails.root}/app/assets/javascripts/#{script}.js"
  extensions = %w(.coffee .erb .coffee.erb) + [""]
  extensions.inject(false) do |truth, extension|
    truth || File.exists?("#{script}#{extension}")
  end
end

アプリケーション レイアウトで呼び出します。

<%= javascript_include_tag params[:controller]  if javascript_exists?(params[:controller]) %>

これにより、より多くの拡張子が処理され、inject を使用してファイルが存在するかどうかが判断されるようになりました。その後、アプリの必要に応じて、extensions 配列にさらに多くの拡張機能を追加できます。


編集 DEUX: #stylesheet_exists を更新しましたか?

同じですが、スタイルシートの場合:

def stylesheet_exists?(stylesheet)
  stylesheet = "#{Rails.root}/app/assets/stylesheets/#{stylesheet}.css"
  extensions = %w(.scss .erb .scss.erb) + [""]
  extensions.inject(false) do |truth, extension|
    truth || File.exists?("#{stylesheet}#{extension}")
  end
end


EDIT最後(おそらく):乾かしてください

def asset_exists?(subdirectory, filename)
  File.exists?(File.join(Rails.root, 'app', 'assets', subdirectory, filename))
end

def image_exists?(image)
  asset_exists?('images', image)
end

def javascript_exists?(script)
  extensions = %w(.coffee .erb .coffee.erb) + [""]
  extensions.inject(false) do |truth, extension|
    truth || asset_exists?('javascripts', "#{script}.js#{extension}")
  end
end

def stylesheet_exists?(stylesheet)
  extensions = %w(.scss .erb .scss.erb) + [""]
  extensions.inject(false) do |truth, extension|
    truth || asset_exists?('stylesheets', "#{stylesheet}.css#{extension}")
  end
end
于 2013-07-20T01:37:37.513 に答える
7

アセット パイプラインと application.js のマニフェストについては知っていますが、私のアプローチは、アプリの「必須」の JavaScript を application.js に保持し、次を使用して各コントローラーに特定の JavaScript のみをロードすることです。

<%= javascript_include_tag "application" %> 
<%= javascript_include_tag controller_name if File.exists?("#{Rails.root}/app/assets/javascripts/#{controller_name}.js") %>

</body> の前の私の application.html.erb の終わりに

これにより、ブラウザーがコントローラー固有の JavaScript を取得するためにもう 1 つの要求を発行することはわかっていますが、おそらく最初の要求の後、その JavaScript はブラウザーによってキャッシュされます。

于 2013-02-27T04:27:19.263 に答える
2

カスタム ViewHelpers で救出!

これをあなたに追加してくださいApplicationHelper

module ApplicationHelper
  def controller_stylesheet(opts = { media: :all })
    if Rails.application.assets.find_asset("#{controller_name}.css")
      stylesheet_link_tag(controller_name, opts)
    end
  end

  def controller_javascript(opts = {})
    if Rails.application.assets.find_asset("#{controller_name}.js")
      javascript_include_tag(controller_name, opts)
    end
  end
end

で次のように使用できますapplication.html.erb

<%= controller_stylesheet %>
<%= controller_javascript %>

注:これは、.css と .js とだけ表示されていても、すべての .js、.coffee、.css、.scss で機能します。

于 2017-02-04T23:27:25.637 に答える
0

Rails3.2 では、js ファイルのリストをapplication.jsファイルの先頭に記述するだけです。例えば、

//=require jquery.min
//=require jquery_ujs
//=require general

これらのファイルのいずれかが実際には存在しない場合 (app/assets/javascripts に配置してください) - 問題ではなく、エラーは表示されません。

于 2012-10-10T21:49:29.647 に答える