繁体   English   中英

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

[英]Ruby on Rails — NameError '@' not allowed as an instance variable name

我是Ruby on Rails的新手,并且已经有一段时间困扰于此错误了。 我希望有人可以给我一些有用的信息来修复此错误。 我有一种感觉,我忽略了一些琐碎的事情。 无论如何,我已经在绘制错误的代码(位于视图中)以及控制器中的代码下方包含了代码。 在进行研究之前,我可能不得不将实例变量放入控制器中-但是,我不确定该过程如何进行以及如何从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

问题在于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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM