1

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しかし、ビューが部分的にロードされたときにアプリに自分のことを知らせるにはどうすればよいですか

4

1 に答える 1