Ruby rails不会创建实例变量

时间:2017-02-14 08:18:58

标签: ruby-on-rails

我正在使用Ruby on Rails的lynda.com教程。创建和使用数组实例变量的第一个实例不起作用。起初我认为@array可能已成为我正在使用的较新的5.0版本rails中的保留字,但更改它并不会导致“nil”(未定义)错误消失。

Ruby Rails 5.0有什么问题?它拒绝定义实例变量并将它们传递给适当的模板。

这极其恶化,因为铁轨的行为并不像记录的那样(即铁路已经脱离了箱子)。

****************
demo_controller.rb

class DemoController < ApplicationController

  def index
    render('hello')
  end

  def hello
     @zarray = [1,2,3,4,5]  <------------ this is defined
  end

  def other_hello
    render(:text => "Hello EVERYONE!")
  end

end

******************
hello.html.erb

<h1>Demo#hello</h1>

<p>Hello World!</p>

<%= 1 + 1 %>   <------ works
<% target = "world" %>
</br>
<%= "Hello #{target}" %>   <----- works
</br>
<% @zarray.each do |n| %>   <---- line 10.  Rails claims that @zarray is 
not defined
  <%= n %></br>
<% end %>

ActionView :: Template :: Error(未定义的方法`每个'为nil:NilClass):

2 个答案:

答案 0 :(得分:1)

我复制并运行了你的代码,它工作正常。我想这可能是因为控制器应该作为一个轨道惯例是多元化的,而你的控制器被称为DemoController并且你可能在某处调用了演示 S #action?因此,从您的终端生成一个名为:

的新控制器
DemosController

使用生成器:

rails g controller Demos

将所有内容从旧控制器复制粘贴到新控制器。 在您的routes.rb中,您需要首先确保拥有正确的resources :demos(模型名称),它将为您提供标准的RESTful资源(indexnew,{ {1}}等,但由于您的“create”方法不是RESTful API的一部分,因此您需要为此创建自定义路由:

hello

get 'hello' => 'demos#hello', :as => :hello = HTTP方法

'get'=您希望hello.html.erb可以访问的URL:localhost:3000 / hello

'hello'=演示是demos#helloDemosController是控制器中的操作。

'#hello'(_ path)是您可以在任何页面上的link_to中调用的命名助手,例如:link_to hello_path。

答案 1 :(得分:-1)

我是Ruby和Rails的新手。我使用普通的STRING实例变量测试,并且从我的控制器传递到我的模板,所以问题是数组定义。显然,我使用的教程中的旧版数组定义不再适用于我正在使用的rails和ruby版本。

我在Windows上使用Ruby on Rails 5.0.1和Ruby 2.2.4p230(2015-12-16修订版53155)[i386-mingw32](rails / ruby​​兼容性是犹太洁食)。

@zarray = [1,2,3,4,5]     <-- the array is not defined when passed to template
@zarray = Array.new << 1 << 2 << 3 << 4 << 5      <-- this works

Ruby甚至没有抱怨数组定义的格式,这有点令人沮丧。它只是没有(即,拒绝初始化数组)。

在模板中:

<% @zarray.each do |n| %>
  <%= n %></br>
<% end %>

如果你在@zarray = Array.new

之后使用@zarray = {1,2,3,4,5],我应该补充一下

换句话说,在Ruby发展的某个阶段,引入了EXPLICITLY分类数组?文档中并不总是很清楚。我之前使用的教程没有明确地对数组进行分类。

问题似乎出现在我正在运行的当前RAILS版本(5.0.1)中。我做了SOMETHING来破坏Ruby使用数组文字语法创建数组的能力。当我在IRB中使用文字语法运行数组定义时,我没有创建它们的问题。 Ruby很好。它是5.0.1版本的rails中的一个严重的BUG。所以我想我应该报告一下。

Welcome to Git (version 1.8.1.2-preview20130201)
$ irb
irb(main):002:0> service_mileage = [5000,15000,30000,60000,100000]
=> [5000, 15000, 30000, 60000, 100000]
irb(main):003:0> service_mileage[0]
=> 5000
irb(main):004:0> service_mileage[2]
=> 30000
irb(main):005:0>