Почему я получаю NoMethodError в этом Ruby-коде?

#ruby #methods #sinatra

#ruby #методы #синатра

Вопрос:

Я пытаюсь выяснить, почему я получаю эту ошибку при запуске этой части моего кода: в ‘clean_up_keywords’: неопределенный метод для ‘gsub’ для nil: NilClass (NoMethodError) Однако, когда я запускаю полный код с помощью Sinatra, я не получаю ошибок.

Частичный код:

 def clean_up_keywords(str)
  str.gsub("n", ",").delete("r").split(',')
end

def clean_up_list(arr)
  arr.reject(amp;:empty?).each(amp;:lstrip!)
end

def make_strings_url_friendly(arr)
  arr.each do |e|
    e.gsub!(" ", " ")
  end
end

def make_urls(arr)
  arr.map {|e| "http://www.google.com/search?num=100amp;q="   e}
end


  params = Hash.new#test
  params["keyword"] = "redrnbluerngreen"
  params["url"] = "http://url.com"
  dirty_list = clean_up_keywords(params[:keyword])
  clean_list = clean_up_list(dirty_list)
  url_ready_list = make_strings_url_friendly(clean_list)
  url_list = make_urls(url_ready_list)
  

Полный код для использования в Sinatra:

 require 'sinatra'
require 'rspec'
require 'nokogiri'
require 'open-uri'

get '/serp_checker' do
  "<form action='/ranked' method='post'>
  <label for='keyword'>Keyword</label>
  <textarea name='keyword' id='keyword' type='text' /></textarea>
  <label for='url'>URL</label>
  <input name='url' id='url' type='text' />
  <input type='submit' value='Go!' />
  </form>"
end

def clean_up_keywords(str)
  str.gsub("n", ",").delete("r").split(',')
end

def clean_up_list(arr)
  arr.reject(amp;:empty?).each(amp;:lstrip!)
end

def make_strings_url_friendly(arr)
  arr.each do |e|
    e.gsub!(" ", " ")
  end
end

def make_urls(arr)
  arr.map {|e| "http://www.google.com/search?num=100amp;q="   e}
end

post '/ranked' do
  #params = Hash.new#test
  #params["keyword"] = "redrnbluerngreen"#test
  #params["url"] = "http://url.com"#test
  #serp = Nokogiri::HTML(open("http://www.google.com/search?num=100amp;q=house"))
  #puts serp.to_s
  dirty_list = clean_up_keywords(params[:keyword])
  clean_list = clean_up_list(dirty_list)
  url_ready_list = make_strings_url_friendly(clean_list)
  url_list = make_urls(url_ready_list)
end
  

Ответ №1:

Вы определяете params["keyword"] but access params[:keyword] , поэтому он возвращает nil , потому что его не удалось найти — символы и строки являются разными объектами в качестве ключей.

Обходной путь заключается в использовании чего-то вродеhttp://as.rubyonrails.org/classes/HashWithIndifferentAccess.html

Комментарии:

1. В качестве альтернативы, если бы ваш код использовал params.fetch("keyword") вместо params["keyword"] , это вызвало бы исключение, говорящее, что "keyword" это не ключ, что позволило бы вам легче изолировать ошибку.