¿Mostrar error de autor y de hora?

Tengo este método en la página del artículo que muestra el autor del artículo y la marca de tiempo y funciona bien en view / articles / show.html.erb. Pero cuando pongo el mismo método en la página de índice en /views/articles/_article.html.erb, sigo recibiendo este error: funciona en la visualización de una página pero no en la otra. ¿Alguna sugerencia?

'El error:'

NoMethodError in Articles#index

Showing /Users/blog/app/views/articles/_article.html.erb where line #13 raised:

undefined method `User' for nil:NilClass
Extracted source (around line #13):

11:
12: <div class="post_by">
13: Posted by <%= @article.user.'username' %> on <%= @article.created_at.strftime("%B %d, %Y") %> 
14: </div>
15: 
Trace of template inclusion: app/views/articles/index.html.erb

Rails.root: /Users/blog

Application Trace | Framework Trace | Full Trace
app/views/articles/_article.html.erb:13:in `_app_views_articles__article_html_erb__997953145_2197490260_6874828'
app/views/articles/index.html.erb:15:in `_app_views_articles_index_html_erb___514612748_2197511860_0'
app/controllers/articles_controller.rb:11:in `index'

preguntado el 16 de mayo de 11 a las 17:05

@article no está definido. Espero @articles es sin embargo, y su parcial espera la variable de instancia en lugar de una variable local. ¿Puede ver el código de los artículos de forma parcial, la página de índice y el controlador? -

No me deja publicar el código que solicitaste como novato :-( -

2 Respuestas

Se espera que esté presente un objeto @article, y probablemente no esté inicializando uno en su método de índice. Por ejemplo, "mostrar" lo define:

def show
  @article = Article.find(params[:id])
end

Pero asegúrese de que su método de índice también tenga algo similar, si de hecho necesita que se cargue un objeto de artículo

def index
  @articles = Article.all
  @article = Article.find(params[:id])
end

Ahora, no sé cuál es su objetivo con la página de índice, pero tendría que pasar un ID específico desde algún lugar para cargar el objeto del artículo en "índice". Por lo tanto, este es un ejemplo algo artificial.

Un caso de uso común para instanciar un objeto en su método de "índice" sería si tiene el formulario "Nuevo artículo" en la página de índice y necesita un objeto Artículo vacío para trabajar. P.ej:

def index
  @articles = Article.all
  @article = Article.new
end

contestado el 16 de mayo de 11 a las 21:05

¿Cómo va a resolver el problema de @ article.user.username la instanciación de un nuevo @article en el índice? Lo más probable es que el usuario ya tenga los @articles correctos. Están usando la colección de renderizado usando parciales que niega la declaración de una variable de instancia inútil y costosa @article ya que Rails automáticamente le da el objeto de la matriz de @articles automáticamente con el mismo nombre que el nombre del parcial. - Aditya Sanghi

Por un lado, no es

<%= @article.user.'username' %> 

, pero

<%= @article.user.username %>

¿Puede mostrar un poco más de su controlador donde está inicializando @user?

Actualización: Basado en más información proporcionada en el comentario a continuación. El mensaje de error no estaba en "Usuario" sino en "usuario". Como tal, la solución fue utilizar el objeto "artículo" proporcionado por el parcial _article.html.erb (lo más probable es que se invoque como parte de una llamada parcial de renderizado desde otra vista).

 <%= article.user.username %>

contestado el 16 de mayo de 11 a las 22:05

Creo que formateaste demasiado el mensaje de error. ¿Fue un "método indefinido User' for nil:NilClass" or "undefined method user 'for nil: NilClass "? El usuario es una clase y el usuario sería un método que no se puede llamar en un @article inexistente. Aditya Sanghi

Lo que significa que @article es nulo :) en lugar de la variable de instancia @article, simplemente suelte @ y pruebe el artículo que es el mismo que el nombre del parcial y, por lo tanto, podría contener el objeto "artículo" real. - Aditya Sanghi

Tienes razón: eliminar el @ en article.user.username y @ en article.created funcionó. Gracias :-) - En todas partes

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.