6

開発.rb:

config.action_controller.asset_host = "assets.myserver.com"

スクリプトを表示:

<%= image_tag('header.jpg') %>

収量:

<img alt="Header" src="/header.jpg" />

次のようにする必要があります。

<img alt="Header" src="http://assets.myserver.com/header.jpg" />

私が推測している宝石を使用していると、rails-apiいくつかのアセットとビューのレンダリングが無効になります。

image_tagこの非常に小さな機能を追加するために再実装 (オーバーライド) するのはそれほど難しくないように思われます。これをやりたいと思うのは少し奇妙に思えるかもしれません。ただし、私はレールに慣れていないので、学習経験としてこれを行う方法を知りたいです。

質問:

  1. ベスト プラクティスとして、この新しいコードをファイル構造のどこに配置すればよいですか?
  2. 新しいコードでファイルに名前を付ける必要がありますか?
  3. 古い image_tag 関数を見るのではなく、新しいコードを見ることをレールはどのようにして知るのでしょうか?
4

1 に答える 1

3

私はあなたの設定を試しましたがconfig.action_controller.asset_host = "assets.myserver.com"、私のdevelopment.rb image_tag作品で期待どおりに使用すると:

<img alt="Header" src="http://assets.myserver.com/assets/header.jpg" />

Rails 3.2.7 と 3.2.8 の両方でテストしましたが、両方のバージョンで動作します。

アップデート

私の最初の答えでは、rails-api宝石を使用しませんでした。rails-apigemを使用する場合image_tagは、質問に記載されているとおりに機能します。

実際の質問に答えるには、に初期化子を追加できますconfig/initializersimage_tag_helper.rb次のコードを使用して、ファイルを作成するだけです。

# config/initializers/image_tag_helper.rb
module ActionView
  module Helpers
    module AssetTagHelper
      def image_tag(source, options = {})
        options[:src] = "http://#{source}"
        tag("img", options)
      end
    end
  end
end

これが基本的に行うことは、モジュールを再度開き、image_tagメソッドを独自のメソッドに置き換えることです。内の他のすべてのメソッドmodule AssetTagHelperは同じままです。メソッドの完全な「例」については、githubの Rails リポジトリを参照してくださいimage_tag

ファイルの名前はあまり重要ではありません。内のすべてのファイルconfig/initializersは、アプリケーションの起動時にロードされます。

基本的に、これは Ruby の言語機能です。Ruby を使用すると、コード内のあらゆる場所でクラスを再度開いたり、メソッドを追加または置換したりできます (この件については、rubylearning.comで詳しく説明しています)。

于 2012-08-31T15:32:02.433 に答える