TypeError, can't convert hash into string

Hola! A ver si alguien me echa un cable pq hoy estoy atontao y no se a
qué se debe este error:

Tengo una librería para hacer spidering. Le pasas una URL y te devuelve
un array con todos los enlaces que encuentra allí. Es muy básica pero
cumple su cometido. Adjunto el código abajo.

Como veis, basta con llamar al método get_links(url).

Por otro lado, en mi aplicación tengo el modelo Page, con un campo
“address” donde están las URL de las páginas almacenadas. Así que tengo
una vista spider a la que le paso el ID de una Page, me coge su address,
la arañea, y me pinta los enlaces que encuentra. Este es el método en el
controlador:

#############################################################
def spider
@page = Page.find(params[:id])
@array_links = Spider.get_links(@page.address)
end
#############################################################

Y esta la vista:

#############################################################

<%= flash[:notice] %>

<%= truncate(@page.address,55) %>

PageRank Spider (testing)

<% @array_links.each do |enlace| %> <%= truncate(enlace, 45) %>
<% end %>

#############################################################

Pues bien, no funciona. Me dice esto:

#############################################################
TypeError in PrincipalController#spider
can’t convert Hash into String

#############################################################

Pero… si en el controlador en lugar de llamarlo pasando el parámetro
@page.address pruebo con una cadena a pelo, sí que funciona. O sea, en
lugar de:

@array_links = Spider.get_links(@page.address)

Le pongo de prueba:

@array_links = Spider.get_links(“http://www.railes.net”)

…entonces si que funciona

¿Qué hago mal? ¿Necesito otro café? :slight_smile:

Jaime

#############################################################

MODULO SPIDER

#############################################################

Web spider

Takes an URL and returns a collection of the URLs it finds there on a

href links

open-uri documentation:

http://www.ruby-doc.org/stdlib/libdoc/open-uri/rdoc/files/open-uri_rb.html

require ‘open-uri’

module Spider

def get_links(url)
	user_agent = "Ruby/#{RUBY_VERSION}"
	referer = "http://www.pagerankalert.com/"

	open(url,
	    "Cookie" =>  @cookie || "",
  	  "User-Agent" => user_agent,
	    "Referer" => referer ) do |file|
	    @body = file.read
	end

	#@body.scan(%r{<a href="(.*?)"}) do |enlace| puts enlace end
	$i = 0
	$a = []
	@body.scan(%r{<a href="(.*?)"}) do |enlace|
		$a[$i] = enlace
		$i = $i+1
	end
	return $a
end

module_function :get_links

end

Igual es una chorrada lo que voy a decir, pero @page.address, ¿estás
convencido de que devuelve una cadena y no un hash?

Pues digo yo que estará devolviendo un hash, pero pensaba que Rails lo
convertiría automáticamente. Por ejemplo, desde la vista:

[spider.rhtml]
#######################################################

<%= flash[:notice] %>

<%= truncate(@page.address,55) %>

PageRank Spider (testing)

<% @array_links.each do |enlace| %> <%= truncate(enlace, 45) %>
<% end %>

#######################################################

Puedes ver que en el título se usa @page.address para mostrarlo, ahí no
da problemas.

Pero al usar @page.address desde el controlador, se ve que no hace la
conversión a string.

He probado también con @page.address.to_s y nada.

Jaimes

El mié, 18-10-2006 a las 11:38 +0200, Juan Lupión escribió: