0

スプレッドシート ファイルからテーブルを「プリロード」するためのインターフェイスを提供しようとしています。簡単に聞こえますが、完全な初心者である私はそれを悪用しています。ファイルがアセットにプリコンパイルされた後、action_view ヘルパー asset_path を使用してファイルを見つけましたが、「NoMethodError: undefined method `asset_path' for #」を取得し続けるため、ヘルパーを適切に含めていないようです。ここに私のモデルコードがあります:

require 'rubygems'
require 'roo' 
require 'action_view'

class Item < ActiveRecord::Base
  include ActionView::Helpers
  validates :description, presence: true, length: { maximum: 240 }
  validates :category, presence: true
  has_many :interests
  has_many :members, through: :interests
end

def populate_items_table
  from_file = asset_path("item_listing.ods")
  original_list = Openoffice.new(from_file)
  original_list.default_sheet = original_list.sheets.first
  headers = original_list.row(1)
  ...
end

ここで私が間違っているところを誰かが指摘できれば、私は最も感謝しています。また、「Rails の方法」でこれを行っていますか? この種のコードは、モデルまたは別の場所に配置する必要がありますか? 私は別の場所を推測しています。そうでなければ、適切なヘルパーはおそらくすでに定義されているでしょうか?

ここのスタックには1などの同様の質問がありますが、答えは私がやっていることと何の違いもないようです。

@shishir: 提案された特定のモジュールを含めた場合のスタック トレースは次のとおりです。

ERROR["test_should_reload_items_table", ItemsControllerTest, 2016-03-22 08:43:53 +0000] test_should_reload_items_table#ItemsControllerTest (1458636233.20s) NoMethodError: NoMethodError: undefined method asset_path' for #<ItemsController:0x000000097cb308> app/models/item.rb:14:inpopulate_items_table' app/controllers/items_controller.rb:67:in reload' test/controllers/items_controller_test.rb:53:inblock in ' app/models/item.rb:14:in populate_items_table' app/controllers/items_controller.rb:67:inreload' test/controllers/items_controller_test.rb:53:in `block in'

4

2 に答える 2

0

asset_path は、モジュールである ActionView::Helpers::AssetUrlHelper で定義されています。使用する

 include ActionView::Helpers::AssetUrlHelper

それ以外の

 include ActionView::Helpers
于 2016-03-31T00:47:29.067 に答える
0
class Item < ActiveRecord::Base
    include ActionView::Helpers
    validates :description, presence: true, length: { maximum: 240 }
    validates :category, presence: true
    has_many :interests
    has_many :members, through: :interests

    def populate_items_table
      from_file = asset_path("item_listing.ods")
      original_list = Openoffice.new(from_file)
      original_list.default_sheet = original_list.sheets.first
      headers = original_list.row(1)
      ...
    end

end

私の理解が正しければ、関数はクラス内にないと機能しません。

いずれにせよ、ActionView::Helpers を含める必要がありますが、現在はそうではありませんが、asset_path 呼び出しに到達するようにします (クラスで分離されているため、現在、宣言した関数とは別のスコープにあります)。 .)

于 2016-03-31T02:00:24.910 に答える