routes.rb でルート コントローラーとして設定されているメニュー コントローラーがあります。私のメニュー ビューで、_lights.slim パーシャルをレンダリングしようとしまし= render :partial => 'lights/lights'
たが、次のエラーが発生しました。undefined method `lights' for nil:NilClass
メニューコントローラー:
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'
ライトコントローラー
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}%
end
Routes.rb
root 'menu#index'
get '/lights', to: 'lights#index'
get '/lights/:label', to: 'lights#light_toggle', as: 'light'
これは簡単なことではありませんが、ここで何をすべきかについて行き詰まっています。Menu#Index
が呼び出されたときに自分のことを知らないLightsController
ので、 @client.blablabla が意味をなさないという問題があるに違いないと私は考えています。LightsController
しかし、ビューが部分的にロードされたときにアプリに自分のことを知らせるにはどうすればよいですか