我试图理解如何在渲染视图的同一个控制器中调用方法时引用回控制器的实例变量。
我基本上使用调制解调器列表在控制器中实例化一个实例变量。在视图中,我想调用一个动作来迭代实例变量数组@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