1

私の質問は、Rails Asset-Pipeline を使用するときの action-view gem の標準的な動作についてです。

例外がスローされ、プリコンパイルされていないイメージがある場合は常にアプリの実行が停止するため、ユーザーは標準の空白ページに「...何か問題が発生しました」と表示されます。

欠落している画像のような些細なこと (アイコンの可能性もあれば、名前のつづりが間違っているだけの可能性もあります...) は、ショーストッパーであってはなりません。それはあるべきですか?

この根本的な動作をより穏やかなバージョンに変更したいと考えています。アプリは引き続き動作しますが、もちろん、欠落している画像については通知します。

質問:

action-view gem に含まれるヘルパー メソッドの関連部分にモンキー パッチを適用する以外に方法はありますか?

このパッチが不要になるように変更できる構成はありますか?

この種のモンキーパッチは、gem の更新の場合のメンテナンスの悪夢と見なされますね。

これが実際のパッチです: "assetpipe_easy_errors.rb" という名前config/initializersで、関連するメソッドは " digest_for"です。

Sprockets::Helpers::RailsHelper::AssetPaths.class_eval do
        attr_accessor :asset_environment, :asset_prefix, :asset_digests, :compile_assets, :digest_assets

        class AssetNotPrecompiledError < StandardError; end

        def asset_for(source, ext)
          source = source.to_s
          return nil if is_uri?(source)
          source = rewrite_extension(source, nil, ext)
          asset_environment[source]
        rescue Sprockets::FileOutsidePaths
          nil
        end

        def digest_for(logical_path)
          if digest_assets && asset_digests && (digest = asset_digests[logical_path])
            return digest
          end

          if compile_assets
            if digest_assets && asset = asset_environment[logical_path]
              return asset.digest_path
            end
            return logical_path
          else
            #original code: raise AssetNotPrecompiledError.new("#{logical_path} isn't precompiled")
            ### own Patch: these next four lines:
            Rails.logger.info(" arrg!! an image is missing ")
            ### example: FeedbackMailer.generic_system_message(subject,bodytext).deliver
            FeedbackMailer.generic_system_message("asset error",logical_path).deliver
            return logical_path
          end
        end

        def rewrite_asset_path(source, dir, options = {})
          if source[0] == ?/
            source
          else
            if digest_assets && options[:digest] != false
              source = digest_for(source)
            end
            source = File.join(dir, source)
            source = "/#{source}" unless source =~ /^\//
            source
          end
        end

        def rewrite_extension(source, dir, ext)
          source_ext = File.extname(source)
          if ext && source_ext != ".#{ext}"
            if !source_ext.empty? && (asset = asset_environment[source]) &&
                  asset.pathname.to_s =~ /#{source}\Z/
              source
            else
              "#{source}.#{ext}"
            end
          else
            source
          end
        end
end

どんなアイデアでも大歓迎です

4

0 に答える 0