我对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
答案 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
。