Porque rails llama a un metodo cuando llamo a una propiedad?


#1

Que tal!

Estoy empezando a desarrollar con Rails…por lo que me compre un libro
llamado Simply Rails. Siguiendo los pasos del libro me encontre con un
error que no me cabe porque puede estar pasando:

undefined method `name’ for nil:NilClass

Les dejo el controlador:
#Controlador empieza aqui#
class StoriesController < ApplicationController
before_filter :login_required, :only => [ :new, :create]

def index
get_stories ‘votes_count >= 5’
end

def bin
get_stories ‘’
render :action => ‘index’
end

protected
def get_stories(conditions)
@stories = Story.find :all, :order => ‘id DESC’, :conditions =>
conditions
end

def new
@story = Story.new
end

def create
#@story = Story.new(params[:story])
@story = @current_user.stories.build params[:story]
if @story.save
flash[:notice] = “La historia a sido agregada correctamente!”
redirect_to stories_path
else
render :action => ‘new’
end
end

def show
@story = Story.find_by_id(params[:id])
end
end
#Controlador termina aqui#

#Vista empieza aqui#

<%= @story.name %>

Shoveadas => <%= @story.votes.size %>

Agregada por: <%= @story.user.login %>

<%= link_to @story.link, @story.link%>

<% form_remote_tag :url => story_votes_path(@story) do %> <%= submit_tag 'Shovealo!' %> <% end %>
    <% if @story.votes.empty? %> Sin shoveadas aun <% else %> <%= render :partial => 'votes/vote', :collection => @story.votes %> <% end %>
#Vista termina aqui#

La clase Story:
#Clase Story empieza aqui#
class Story < ActiveRecord::Base
belongs_to :user
validates_presence_of :name, :link
has_many :votes

def to_param
“#{id}-#{name.gsub(/\W/, ‘-’).downcase}”
end

has_many :votes do
def lastest
find :all, :order => ‘id DESC’
end
end
end
#Clase Story termina aqui#

La migracion:
#Migracion empieza aqui#
class CreateStories < ActiveRecord::Migration
def self.up
create_table :stories do |t|
t.string :name
t.string :link

  t.timestamps
end

end

def self.down
drop_table :stories
end
end
#Migracion termina aqui#

De antemano gracias!


#2

Hola que tal, primero lo primero, muestra el mensaje de error, no nos
has dicho que accion estas ejecutando y que linea te da el error.

Pdta: No comiences con simply, es un libro que te deja muchas lagunas,
debes empezar por railstutorial.org es el mejor para comenzar, creeme yo
me lei simply rails 2, Agile Web D. y railstutoria, y te digo
por experiencia que este ultimo es el mejor para comenzar, ya despues te
metes con Agile Web …


#3

Omar,

En cuanto al error, no vamos a poder ayudar porque no sabemos ni que
método se está ejecutando, ni que vista es la que se está renderizando.
De todas maneras, intentando responder a tu pregunta de por que que se
está ejecuntado un método en lugar de una propiedad, si por propiedad te
referís a un atributo, entonces recordá que Ruby no permite el acceso de
manera directa a los atributos (principio de encapsulamiento), siempre
cuando “accedes” a un atributo, en realidad accedés a un método con el
mismo nombre que el atributo.
Saludos.


#4

no entiendo mucho la idea del to_param…por lo que parece es para
generar direcciones prolijas (www.articulo.com/1miszapatos en vez de
solo www.articulo.com/1)…esto mas que una tecnica creo que es un
hack…un truco…revisa que en el libro el codigo dentro de “to_param”
este bien…ademas revisa despues de (params[:id]) creo que para que
el hack funcionara deberia ser (params[:id].to_i) asi rails en vez de
interpretar 1miszapatos lo convierte a entero y obtiene un 1…

revisa que en el modelo no tengas algo como
before_create :to_param

la verdad no creo, porque por lo que entiendo estas sobreescribiendo el
metodo param

todo lo demas luce normal, el error debe estar en algo de eso

la verdad a mi no me convence hacer esto, ademas si estas comenzando es
medio confuso…como te dije es mas un hack que una tecnica y hay
plugins que te hacen esto de mejor manera y con mejores resultados
(quedandote /mis_zapatos en vez de 1mis_zapatos…que es l ideal)

revisa eso porque estoy casi seguro que el error esta por ahi…suerte
:smiley: