我有一个控制器,它只有一个宁静的动作索引。但是,在这个方法中有很多代码,所以我需要将其分解为另外两个方法 - devices_table和results_table,但我仍然需要只在索引页面上显示所有内容。所以,我在他们自己的视图中创建了两个表,并使用render template:
来获取索引页面上的表。每个表方法都有一个数组,在我的视图中迭代。当我在table方法中声明数组变量时,我得到一个错误,说它是nil。我发现我需要将数组变量添加到我的索引方法中,以便它在索引视图中可用,因为从技术上讲,这是所有html被加载的地方。然而,即使阵列现在不是零,它也是空的。我已经尝试了我能想到的一切 - 在索引和表方法中声明变量,将局部变量和渲染模板一起传递,但我的数组仍然是空的。有任何想法吗?
这是我的代码:
控制器(部分):
def index
@business = Business.find params[:id]
@mongo_db = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test')
@migration_ids = []
@devices = []
end
def devices_table
@business.devices.each do |device|
@mongo_db[:migration_resources].find(:location => /.*#{device.uuid}.*/).each do |resource|
migration_location = resource["location"]
start_marker = "/migrations/"
end_marker = "/folders/"
@migration_ids << migration_location[/#{start_marker}(.*?)#{end_marker}/m, 1]
end
end
end
索引视图(顺便说一句,这很苗条,不是常规的HTML):
#page-body
.left-column
.box
= render template: 'admin/v3_migrations/devices_table'
Devices_table查看:
.col-md-12
h4= "Devices (#{@business.devices.count})"
.table-wrapper
table.table.table-hover
thead
tr
th.col-md-1 ID
th.col-md-3 Name
th.col-md-3 UUID
th.col-md-2 Status
th.col-md-3 Migration UUID
th.col-md-1
tbody
- @business.devices.each do |device|
tr
td= device.id
td= device.name
td= device.uuid
td= device.status
- @migration_ids.each do |id|
td= id
td= link_to admin_v3_migration_path(mig_id: id)
i.fa.fa-download
如果我改为像这样写我的控制器,我会在数组上得到一个nil类错误。
def index
@business = Business.find params[:id]
end
def devices_table
@business = Business.find params[:id]
@mongo_db = Mongo::Client.new([ '127.0.0.1:27017' ], :database => 'test')
@migration_ids = []
@business.devices.each do |device|
@mongo_db[:migration_resources].find(:location => /.*#{device.uuid}.*/).each do |resource|
migration_location = resource["location"]
start_marker = "/migrations/"
end_marker = "/folders/"
@migration_ids << migration_location[/#{start_marker}(.*?)#{end_marker}/m, 1]
end
end
end
当所有代码都在单索引方法中时,一切都很好,所以我知道它不是数据库问题。此外,除了我从@migration_ids
数组中取回的数据之外,所有内容都显示在表中,因此我知道一切都正常呈现。我尝试了很多不同的小调整,但我不想发布所有代码变体。