Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 未定义的方法“[]';for nil:application helper中方法的NilClass_Ruby On Rails_Ruby_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 未定义的方法“[]';for nil:application helper中方法的NilClass

Ruby on rails 未定义的方法“[]';for nil:application helper中方法的NilClass,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我有一个叫做crumps的方法,意思是未定义的方法。我正在从sinatra应用程序导入代码,并尝试使其与rails应用程序一起工作 以下是方法: def crumbs primary, secondary = current_link return { primary: { icon: menu[primary.to_sym][:primary][:icon], label: menu[primary.to_sym][:primary][:label]}, secondary

我有一个叫做crumps的方法,意思是未定义的方法。我正在从sinatra应用程序导入代码,并尝试使其与rails应用程序一起工作

以下是方法:

def crumbs
primary, secondary = current_link
return {
    primary:   { icon: menu[primary.to_sym][:primary][:icon], label: menu[primary.to_sym][:primary][:label]},
    secondary: {
        icon:  menu[primary.to_sym][:items][secondary.to_sym][:icon],
        label: menu[primary.to_sym][:items][secondary.to_sym][:label]
    }
}
end
以下是该方法中包含的其他方法:

 def menu
  return {
    dashboard: {
        primary: { link: "dashboard", icon: "icon-dashboard", label: "Dashboard" },
        items: {
            dashboard: { icon: "icon-dashboard", label: "Dashboard" }
        }
    },
    ui_lab: {
        primary: { link: "buttons", icon: "icon-beaker", label: "UI Lab" },
        items: {
            buttons: { icon: "icon-hand-up",       label: "Buttons" },
            general: { icon: "icon-beaker",        label: "General elements" },
            icons:   { icon: "icon-info-sign",     label: "Icons"},
            grid:    { icon: "icon-th-large",      label: "Grid"},
            tables:  { icon: "icon-table",         label: "Tables"},
            widgets: { icon: "icon-plus-sign-alt", label: "Widgets"},
        }
    },
    forms: {
        primary: { link: "forms", icon: "icon-edit", label: "Forms" },
        items: {
            forms: { icon: "icon-edit", label: "Form Elements" }
        }
    },
    charts: {
        primary: { link: "charts", icon: "icon-bar-chart", label: "Charts"},
        items: {
            charts: { icon: "icon-bar-chart", label: "Charts"}
        }
    },
    other: {
        primary: { link: "wizard", icon: "icon-link", label: "Others"},
        items: {
            wizard: { icon: "icon-magic", label: "Wizard" },
            login: { icon: "icon-user", label: "Login Page" },
            sign_up: { icon: "icon-user", label: "Sign Up Page" },
            full_calendar: { icon: "icon-calendar", label: "Full Calendar" },
            error404: { icon: "icon-ban-circle", label: "Error 404 page" },
        }
    }
}
end
除了这个:

def current_link
root_path = "/"
current_route = request.url.split("/") # pages/dashboard/stats.html -> ['dashboard', 'stats.html']
return current_route.compact.first, current_route.compact.split(".").first
end
在视图中,这就是所谓的:

      <i class="<%= crumbs[:secondary][:icon] %>"></i>
        <%= crumbs[:secondary][:label] %>


有什么想法吗?

只需定义nil缺少的方法:

def nil.[] x
  puts "You hit the jackpot!!! You win #{x}!!!"
  # Or come up with the behavior according to your own needs.
end
撇开玩笑不谈,你的问题没有提供足够的信息来确定你真正的问题。您的一个或多个哈希似乎不包含搜索的键,然后您尝试向它发送
#[]
方法。尝试
Object#尝试
ActiveSupport
中的
方法,或编写:

def crumbs
  primary, secondary = current_link
  return {
    primary: { icon: ( menu[primary.to_sym][:primary][:icon] rescue nil ),
               label: ( menu[primary.to_sym][:primary][:label]} rescue nil ),
    secondary:
      { icon: ( menu[primary.to_sym][:items][secondary.to_sym][:icon] rescue nil ),
        label: ( menu[primary.to_sym][:items][secondary.to_sym][:label] rescue nil )
      }
    }
end

只需为nil定义缺少的方法:

def nil.[] x
  puts "You hit the jackpot!!! You win #{x}!!!"
  # Or come up with the behavior according to your own needs.
end
撇开玩笑不谈,你的问题没有提供足够的信息来确定你真正的问题。您的一个或多个哈希似乎不包含搜索的键,然后您尝试向它发送
#[]
方法。尝试
Object#尝试
ActiveSupport
中的
方法,或编写:

def crumbs
  primary, secondary = current_link
  return {
    primary: { icon: ( menu[primary.to_sym][:primary][:icon] rescue nil ),
               label: ( menu[primary.to_sym][:primary][:label]} rescue nil ),
    secondary:
      { icon: ( menu[primary.to_sym][:items][secondary.to_sym][:icon] rescue nil ),
        label: ( menu[primary.to_sym][:items][secondary.to_sym][:label] rescue nil )
      }
    }
end

查找这些内容的一种方法是将
[]
调用替换为对
:fetch
的调用。当它爆炸时,它将返回一个
KeyError
来告诉您丢失了哪把钥匙:

> mystery = { a: 1, b: 2, c: 3 }
=> {:a=>1, :b=>2, :c=>3}

> mystery[:d][:q]
NoMethodError: undefined method `[]' for nil:NilClass

> mystery.fetch(:d).fetch(:q)
KeyError: key not found: :d

查找这些内容的一种方法是将
[]
调用替换为对
:fetch
的调用。当它被炸开时,它将返回一个
KeyError
告诉您缺少哪个键:

> mystery = { a: 1, b: 2, c: 3 }
=> {:a=>1, :b=>2, :c=>3}

> mystery[:d][:q]
NoMethodError: undefined method `[]' for nil:NilClass

> mystery.fetch(:d).fetch(:q)
KeyError: key not found: :d

在返回nil-menu[primary.to_sym]#=>nil[]的链上使用[:symbol],在返回nil-menu[primary.to_sym]#=>nil[]的链上使用[:symbol]