首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >呈现属于另一个控制器的部分

呈现属于另一个控制器的部分
EN

Stack Overflow用户
提问于 2014-07-29 07:17:12
回答 1查看 1K关注 0票数 1

我有一个菜单控制器,它在routes.rb中设置为我的根控制器。在我的菜单视图中,我尝试将_lights.slim部分呈现为= render :partial => 'lights/lights',但是我得到了以下错误:undefined method `lights' for nil:NilClass

MenuController:

代码语言:javascript
复制
class MenuController < ApplicationController
  def index
  end
end

菜单视图 (index.slim)

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

代码语言:javascript
复制
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

代码语言:javascript
复制
root 'menu#index'
get '/lights', to: 'lights#index'
get '/lights/:label', to: 'lights#light_toggle', as: 'light'

我知道这是个不需要思考的问题,但我不知道该怎么做。我想,当Menu#Index被调用时,我从来不知道我的LightsController,所以@client.blablabla永远不会有意义,这肯定是个问题。但是,当视图作为部分加载时,我将如何使我的应用程序了解我的LightsController

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-29 10:39:27

部分数

您必须认识到,Partials不依赖于控制器(存储在控制器视图目录中并不会将它们绑定用于该控制器)。

这意味着,如果您有在另一个控制器中支持部分的功能,您应该能够在应用程序的不同部分使用它。

--

误差

这让我们找到了你所收到的问题。

引起问题的不是部分的调用-而是如何引用其中的代码:

NilClass的未定义方法“`lights”

错误很明显,您试图对一个不存在的对象/变量调用lights方法。这是在partial内部定义的:

代码语言:javascript
复制
@client.lights.map do |c|

因此,您需要能够将正确的数据传递给分部,使其能够加载@client对象而不依赖于控制器。

--

Fix

为此,您可以考虑使用局部本地人 -

代码语言:javascript
复制
<%= render partial: "lights/lights", locals: {client: @client} %>

这意味着每次调用分部时,都必须将@client对象传递到client本地变量,从而允许分部独立运行控制器。

下面是您如何处理部分内容的方法:

代码语言:javascript
复制
#app/views/lights/_lights.slim
- client.lights.map do |c|
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25010030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档