2014-12-08 3 views
1

Я довольно новичок в Ruby on Rails и уже довольно давно застрял в этой ошибке. Я надеюсь, что кто-то может дать мне полезную информацию, чтобы исправить эту ошибку. У меня такое чувство, что я пропускаю что-то тривиальное. Во всяком случае, я включил ниже своего кода, который рисует ошибку (то есть в представлении), а также мой код, который находится в моем контроллере. Хотя я провел свое исследование перед публикацией здесь, мне, возможно, придется поместить мою переменную экземпляра в мой контроллер, однако я не уверен, как этот процесс идет, а затем как вызвать его из моего представления. Буду признателен за любую помощь! Заранее спасибо :)Ruby on Rails - NameError '@' не разрешено как имя переменной экземпляра

Я получаю ошибку:

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

Я считаю, что вам не нужно скрывать знак at: '' @ # {...} "' – August

+0

@August - Пробовал, что ничего не изменил. – Louie

+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.

+0

Приведенный выше код является примером, иллюстрирующим лучший способ организации вашего кода. Он не предназначен для копирования и вставки в ваш собственный код. Вам нужно будет написать свой собственный код. И повторить, NameError, который вы изначально видели, состоит в том, что 'params [: model]' is 'nil', а код выше не будет исправлять это. Вам нужно выяснить, почему ваш контроллер не получает параметры, которые вы ожидаете. –

+0

P.S. Синтаксическая ошибка предполагает, что вы используете очень старую версию Ruby, которая не поддерживает этот стиль инициализации Hash (т. Е. '{Foo: 1}' vs. '{: foo => 1}'). В 2014 году вы должны использовать Ruby 1.9.3 как минимум. –

+0

Я использую Rails 4.1.1 – Louie

Смежные вопросы