1

lib フォルダーのモジュールに API 呼び出しがあり、ビューで使用する必要がある変数を返します。例: モジュールで次のように定義します

module ProdInfo
  def get_item_info(id) 
    @url = "Blah"
  end
end

私のコントローラー:

class RecommendationsController < ApplicationController
  require 'get_prod_info'
  include ProdInfo

  def index
    @product = Product.find(params["product_id"])
    get_item_info(@product.id)
  end
end

おすすめビューで @url を呼び出そうとしていますが、正しく呼び出されていません。モジュールに @url を配置すると、正しい URL が出力されますが、コントローラーで同じことを行うと、何も出力されません。

4

1 に答える 1

0

これは本質的に、両方の場所でコードに拡張されたKaerosのコメントです。

変数をlibフォルダーではなくコントローラーに保存する必要があります。lib内のファイルは、モデルのニーズを認識していないはずです。保存する場所や方法がわからなくても、値を返すのは同じように幸せです。

module ProdInfo
  def get_item_info(id) 
    # in your comment you said you have multiple values you need to access from here
    # you just need to have it return a hash so you can access each part in your view

    # gather info
    { :inventory => 3, :color => "blue", :category => "tool"} # this is returned to the controller
  end
end

Rails 3には、ロードするパスを指定できる構成変数もあり、デフォルトにはlibパスが含まれていると思います。requireこれは、すべてのエントリが必要なわけではないことを意味します。Module#methodペアを呼び出すことができます。

class RecommendationsController < ApplicationController
  # require 'get_prod_info'
  # include ProdInfo
  # => In Rails 3, the lib folder is auto-loaded, right?

  def index
    @product = Product.find(params["product_id"])
    @item_info = ProdInfo.get_item_info(@product.id) # the hash you created is saved here
  end
end

ビューで使用する方法は次のとおりです。

# show_item.text.erb

This is my fancy <%= @item_info[:color] %> item, which is a <%= @item_info[:type] %>.

I have <%= @item_info[:inventory] %> of them.
于 2013-02-25T19:31:48.547 に答える