Ruby on Rails - NameError'@'不允许作为实例变量名

时间:2014-12-08 18:04:17

标签: ruby-on-rails ruby instance-variables

我对Ruby on Rails相当新,并且已经在这个问题上坚持了很长一段时间。我希望有人能给我一些有用的信息来解决这个bug。我有一种感觉,我忽略了一些微不足道的事情。无论如何,我已经在我的代码中包含了绘制错误(在视图中)以及我的控制器中的代码。虽然我在发布之前完成了我的研究,但我可能不得不将我的实例变量放在我的控制器中 - 但是,我不确定该过程如何进行,然后如何从我的View中调用它。我将不胜感激任何帮助!在此先感谢:)

我得到的错误:

NameError in Search#indx
'@' is not allowed as an instance variable name

以下是我在视图中绘制错误的代码行(apps/views/search/index.html.erb):

<% @search = instance_variable_get("\@#{params[:model].to_s.downcase.pluralize}")%>

以下是我的控制器中的代码(apps/controllers/search_controller.rb):

class SearchController < ApplicationController
  def index
    @containers = Container.search(params[:q])
    @cpus = Cpu.search(params[:q])
    @disks = Disk.search(params[:q])
    @firmwares = Firmware.search(params[:q])
    @hardwares = Hardware.search(params[:q])
    @hosts = Host.search(params[:q])
    @interfaces = Interface.search(params[:q])
    @lans = Lan.search(params[:q])
    @licenses = License.search(params[:q])
    @rams = Memory.search(params[:q])
    @networks = Network.search(params[:q])
    @products = Product.search(params[:q])
    @roles = Role.search(params[:q])
    @sites = Site.search(params[:q])
    @vmpools = Vmpool.search(params[:q])
    @trackings = Tracking.search(params[:q])
  end

end

1 个答案:

答案 0 :(得分:7)

问题是params[:model]nil,所以你基本上做instance_variable_get("@")

查看Rails日志,看看您认为收到的参数是否真正被接收。

修改:以下内容与您遇到的问题没有直接关系(前两句话解释了您遇到此问题的原因),而是提出改进建议代码的组织方式。

在视图中执行instance_variable_get是一个非常糟糕的代码味道。真的,做instance_variable_get根本就是代码气味。几乎可以肯定,这是一种更好的方式去做你想做的事情。例如:

def index
  query = search_params[:q]
  @search_results = {
    containers: Container.search(query),
    cpus:       Cpu.search(query),
    disks:      Disk.search(query),
    # ...
  }

  model = search_params[:model].to_s.downcase.pluralize # <-- this is also pretty smelly
  @search = @search_results[model]
end

private
def search_params
  params.require(:q, :model)
end

然后在您的视图中,您只需访问@search