如何传递或引用原始控制器实例变量?解

时间:2014-01-17 18:14:39

标签: ruby-on-rails view parameters

我试图理解如何在渲染视图的同一个控制器中调用方法时引用回控制器的实例变量。

我基本上使用调制解调器列表在控制器中实例化一个实例变量。在视图中,我想调用一个动作来迭代实例变量数组@modems并执行一个动作。我的问题是我似乎无法在被调用的动作中引用@modems实例变量,也不能从视图中传递它。如果我尝试将实际的@modems传回控制器,我会收到“连接重置”错误页面。并且引用原始实例变量失败。我偶然尝试在应用程序控制器中定义/设置@modem_cache,然后将其设置为等于getmodems方法中的@modems数组,然后在resetmodemcounters中引用它并将实例变量传回,无法正常工作。我确信有一些我忽视的基本面,但没有看到它们。我想我已经包含了所有相关信息。请说明我是否需要提供额外的服务。关于我做错了什么或者如何做得更好的任何建议我都会非常感激。

提前谢谢你!

Controller app / controllers / cmts / cmts_controller.rb

def getmodems
  # Array of modems and stats (NOT ActiveRecord)
  @modems = Modems.all()
  respond_to do |format|
      format.html { render :modems, :layout => "application" }
  end
end

# Called from modem.html.erb view
def resetmodemcounters
  if (session[:admin])
    params[:targets].each do |cm|
      # do action
    end
  end
end

查看app / views / cmts / modems.html.rb

....
<%= link_to image_tag('recycle-red-button.png', :height => '30', :width => '35'), resetmodemcounters_path(:targets => @modems), :confirm => 'Are you sure?', :method => :get %>

<% @modems.each do |cm| %>
  <!-- Table of modem stats -->
<% end %>
....

还试过这个:

Controller app / controllers / application_controller.rb

class ApplicationController < ActionController::Base
  ....
  @sweep_cache = nil
  ....
end

Controller app / controllers / cmts / cmts_controller.rb

def getmodems
  # Array of modems and stats (NOT ActiveRecord)
  @modems = Modems.all()
  @modems_cache = @modems
  respond_to do |format|
      format.html { render :modems, :layout => "application" }
  end
end

def resetmodemcounters
  log(params)
  # {"_method"=>"get", "authenticity_token"=>"cZqSqAVKBpTiN5ZQSF1xUXMSiQmtDSQp8/6CRfis3Xs=", "target"=>"all", "controller"=>"cmts", "action"=>"resetmodemcounters"}
  log(@modems_cache)
  # nil

  if (session[:admin])
    if (params[:target] == 'all')
        @modems_cache.each do |cm|
          # do action
        end
    end
  end
end

查看app / views / cmts / modems.html.rb

....
<%= link_to image_tag('recycle-red-button.png', :height => '30', :width => '35'), resetmodemcounters_path(:targets => 'all'), :confirm => 'Are you sure?', :method => :get %>

<% @modems.each do |cm| %>
  <!-- Table of modem stats -->
<% end %>
....

这是我与之合作的作品 - 是否有更好的方法来解决这个问题?

class ModemsCache
  DATA = []
  def update( modems )
    DATA.replace modems
  end
end

def getmodems
  # Array of modems and stats (NOT ActiveRecord)
  @modems = Modems.all()

  # Update Cache
  ModemsCache.new.update(@modems)

  respond_to do |format|
      format.html { render :modems, :layout => "application" }
  end
end

def resetmodemcounters
  if (session[:admin])

    # Get Cached Data
    modems = ModemsCache::DATA

    modems.each do |cm|
      # do action
    end
  end
end

0 个答案:

没有答案
相关问题