我有一个菜单控制器,它在routes.rb中设置为我的根控制器。在我的菜单视图中,我尝试将_lights.slim部分呈现为= render :partial => 'lights/lights',但是我得到了以下错误:undefined method `lights' for nil:NilClass
MenuController:
class MenuController < ApplicationController
def index
end
end菜单视图 (index.slim)
ul.tabs.vertical data-tab=""
li.tab-title.active
a href="#panel1a" Tab 1
.tabs-content.vertical
#panel1a.content.active
= render :partial => 'lights/lights'LightsController
class LightsController < ApplicationController
before_action :discover_lights
include LIFX
@client = LIFX::Client.lan
@client.discover!
3.times do
@client.lights.refresh
sleep (0.5)
puts "Found #{@client.lights.count} with labels #{@client.lights}"
end
def index
end
def new
end
def light_toggle
light = @client.lights.with_label(params[:label])
light.on? ? light.turn_off : light.turn_on
redirect_to '/'
end
private
def discover_lights
@client = LIFX::Client.lan
@client.discover!
end
end灯光视图 (_lights.slim)
h1.subheader LIFX Lights
table.light-table
thead
tr
th Light
th Status
th Power On/Off
th Brightness
tbody
-@client.lights.map do |c|
tr
th #{c.label}
th #{c.power}
th =link_to 'Toggle', light_path(:label => c.label)
th #{c.color.brightness.round(2) * 100}%
endRoutes.rb
root 'menu#index'
get '/lights', to: 'lights#index'
get '/lights/:label', to: 'lights#light_toggle', as: 'light'我知道这是个不需要思考的问题,但我不知道该怎么做。我想,当Menu#Index被调用时,我从来不知道我的LightsController,所以@client.blablabla永远不会有意义,这肯定是个问题。但是,当视图作为部分加载时,我将如何使我的应用程序了解我的LightsController
发布于 2014-07-29 10:39:27
部分数
您必须认识到,Partials不依赖于控制器(存储在控制器视图目录中并不会将它们绑定用于该控制器)。
这意味着,如果您有在另一个控制器中支持部分的功能,您应该能够在应用程序的不同部分使用它。
--
误差
这让我们找到了你所收到的问题。
引起问题的不是部分的调用-而是如何引用其中的代码:
NilClass的未定义方法“`lights”
错误很明显,您试图对一个不存在的对象/变量调用lights方法。这是在partial内部定义的:
@client.lights.map do |c|因此,您需要能够将正确的数据传递给分部,使其能够加载@client对象而不依赖于控制器。
--
Fix
为此,您可以考虑使用局部本地人 -
<%= render partial: "lights/lights", locals: {client: @client} %>这意味着每次调用分部时,都必须将@client对象传递到client本地变量,从而允许分部独立运行控制器。
下面是您如何处理部分内容的方法:
#app/views/lights/_lights.slim
- client.lights.map do |c|https://stackoverflow.com/questions/25010030
复制相似问题