Forum: Rails-ES Porque rails llama a un metodo cuando llamo a una propiedad?

D96ed746b10e87bd52a66a5ed33afb5c?d=identicon&s=25 Omar Renteria (wisemaster)
on 2010-06-18 00:42
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#
<h2><%= @story.name %></h2><!--aqui es donde se produce el error-->
<h3>
  <span id="vote_score">
    Shoveadas => <%= @story.votes.size %>
  </span>
</h3>
<p class="submited_by"> Agregada por: <%= @story.user.login %> </p>
<p><%= link_to @story.link, @story.link%></p>
<div id="vote_form">
  <% form_remote_tag :url => story_votes_path(@story) do %>
    <%= submit_tag 'Shovealo!' %>
  <% end %>
</div>
<ul id="vote_history">
  <% if @story.votes.empty? %>
    <em>Sin shoveadas aun</em>
  <% else %>
    <%= render :partial => 'votes/vote', :collection => @story.votes %>
  <% end %>
</ul>
#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!
86973ba4ee3237a719862c1c26379095?d=identicon&s=25 Cristian Vasquez (heavyblade)
on 2010-06-22 08:23
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 Development y railstutoria, y te digo
por experiencia que este ultimo es el mejor para comenzar, ya despues te
metes con Agile Web ...
D67b951d3ef8e9d79b4c62e3a3c52b4e?d=identicon&s=25 Cristhian Boujon (overflow012)
on 2010-06-22 17:37
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.
0cf784e5eec99ca94b573d83a0193b6a?d=identicon&s=25 Angel Marques (angel21os)
on 2010-06-25 08:08
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
:D
This topic is locked and can not be replied to.