【问题标题】:Rendering partial that belongs to another controller渲染属于另一个控制器的部分
【发布时间】:2014-09-20 12:19:21
【问题描述】:

我有一个菜单控制器,它在 routes.rb 中设置为我的根控制器。在我的菜单视图中,我尝试使用 = render :partial => 'lights/lights' 渲染 _lights.slim 部分,但出现以下错误: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

【问题讨论】:

  • 问题是@clientnil在这一行-@client.lights.map do |c|。渲染partial没有错。
  • 是的,我知道问题出在那儿,但是我怎样才能让 MenuController 了解 LightsController 中的逻辑

标签: ruby ruby-on-rails-4 controller partials lifx


【解决方案1】:

Partials

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

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

--

错误

这会让我们确定您遇到的问题。

导致问题的不是部分的 调用 - 这是您引用其中代码的方式:

nil:NilClass 的未定义方法 `lights'

错误显然是您试图在不存在的对象/变量上调用lights 方法。这是在partial 本身内部定义的:

@client.lights.map do |c|

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

--

修复

为此,您不妨考虑使用partial locals -

<%= render partial: "lights/lights", locals: {client: @client} %>

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

以下是您在部分本身中处理它的方式:

#app/views/lights/_lights.slim
- client.lights.map do |c|

【讨论】:

  • 感谢您对一个看似简单的问题的详尽回答! :) 赞赏!
猜你喜欢
  • 2016-02-03
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2015-10-25
相关资源
最近更新 更多