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)
问题是,所以你基本上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.
| 归档时间: |
|
| 查看次数: |
4693 次 |
| 最近记录: |