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

1 ruby ruby-on-rails instance-variables

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

我得到的错误:

NameError in Search#indx
'@' is not allowed as an instance variable name
Run Code Online (Sandbox Code Playgroud)

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

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

这是我的controller(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
Run Code Online (Sandbox Code Playgroud)

Jor*_*ing 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
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以访问@search.