将实例变量从lib模块传递给控制器

时间:2013-02-25 18:24:24

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.1 ruby-on-rails-3.2

我在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,但是如果我在控制器中执行相同操作,则不会输出任何内容。

1 个答案:

答案 0 :(得分: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.