ruby-on-rails - software - ruby on rails tutorial
"Undefined method` title ''para nil: NilClass "Tutorial de guĂas Rails (8)
El tutorial tiene un error tipográfico entonces, porque seguí estos mismos pasos y resolví el mismo problema. Sin embargo, estaba siguiendo el tutorial.
def create
@post = Post.new(post_params)
@post.save
redirect_to @post
end
private
def post_params
params.require(:post).permit(:title, :text)
end
Estoy trabajando en RailsGuides Tutorial (creando una aplicación de blog). Cuando ejecuto el servidor y abro: /posts/new
todo se ve bien. Pero cuando intento crear una publicación, aparece este error:
NoMethodError en Publicaciones # show
Mostrando /home/darek/rails_projects/blog/app/views/posts/show.html.erb donde se levantó la línea # 3:
método indefinido `title ''para nil: NilClass
Fuente extraída (alrededor de la línea # 3):
1 <p>
2 <strong>Title:</strong>
3 <%= @post.title %>
4 </p>
5 <p>
De hecho, se creó la publicación y puedo ver el título y el contenido en / posts. Pero cuando intento utilizar la publicación específica, aparece este error. Mi primera pista fue cambiar de línea.
<%= @post.title %>
a
<%= @post.try(:title) %>
El error se ha ido, pero el problema no se resuelve.
Cuando intento mostrar publicaciones específicas, obtengo los formularios Título y Texto vacíos. No es lo que quiero ver;)
Ok, aquí está el código
Mostrar.html.erb
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<p>
<strong>Text:</strong>
<%= @post.text %>
</p>
<h2>Add a comment:</h2>
<%= form_for([@post, @post.comments.build]) do |f| %>
<p>
<%= f.label :commenter %><br />
<%= f.text_field :commenter %>
</p>
<p>
<%= f.label :body %><br />
<%= f.text_area :body %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
<%= link_to ''Edit Post'', edit_post_path(@post) %> |
<%= link_to ''Back to Posts'', posts_path %>
Posts_controller.rb
class PostsController < ApplicationController
def new
@post = Post.new
end
def index
@posts = Post.all
end
def create
@post = Post.new(params[:post].permit(:title, :text))
if @post.save
redirect_to @post
else
render ''new''
end
end
private
def post_params
params.require(:post).permit(:title, :text)
end
def show
@post = Post.find(params[:id])
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
if @post.update(params[:post].permit(:title, :text))
redirect_to @post
else
render ''edit''
end
end
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to posts_path
end
end
Rutas de Rake:
-VirtualBox:~/rails_projects/blog$ rake routes
Prefix Verb URI Pattern Controller#Action
post_comments GET /posts/:post_id/comments(.:format) comments#index
POST /posts/:post_id/comments(.:format) comments#create
new_post_comment GET /posts/:post_id/comments/new(.:format) comments#new
edit_post_comment GET /posts/:post_id/comments/:id/edit(.:format) comments#edit
post_comment GET /posts/:post_id/comments/:id(.:format) comments#show
PATCH /posts/:post_id/comments/:id(.:format) comments#update
PUT /posts/:post_id/comments/:id(.:format) comments#update
DELETE /posts/:post_id/comments/:id(.:format) comments#destroy
posts GET /posts(.:format) posts#index
POST /posts(.:format) posts#create
new_post GET /posts/new(.:format) posts#new
edit_post GET /posts/:id/edit(.:format) posts#edit
post GET /posts/:id(.:format) posts#show
PATCH /posts/:id(.:format) posts#update
PUT /posts/:id(.:format) posts#update
DELETE /posts/:id(.:format) posts#destroy
root GET / welcome#index
GET /posts/:id(.:format) posts#view
DELETE /posts/:id(.:format) posts#destroy
Gracias por su ayuda e interés!
En mi caso, no estaba escribiendo esta línea debajo de la definición de la clase (maps_controller):
class MapsController < ApplicationController
before_action :set_map, only: [:show, :edit, :update,:destroy]
...
end
El mapa es mi modelo, después de escribir esa línea, Mi vista funcionó. Tenga cuidado de no poner el código público por debajo de los métodos privados.
Has hecho tus métodos privados. Recuerda donde pones palabra clave privada. Todos los métodos a continuación que se convertirán en privados, definirán sus métodos de esta manera. Métodos privados en extremo del controlador:
class PostsController < ApplicationController
def new
@post = Post.new
end
def index
@posts = Post.all
end
def create
@post = Post.new(params[:post].permit(:title, :text))
if @post.save
redirect_to @post
else
render ''new''
end
end
def show
@post = Post.find(params[:id])
end
def edit
@post = Post.find(params[:id])
end
def update
@post = Post.find(params[:id])
if @post.update(params[:post].permit(:title, :text))
redirect_to @post
else
render ''edit''
end
end
def destroy
@post = Post.find(params[:id])
@post.destroy
redirect_to posts_path
end
private
def post_params
params.require(:post).permit(:title, :text)
end
end
Espero que ayude. Gracias
Me encontré con el mismo problema que tú al seguir el tutorial. Y revisé mis códigos otra vez y luego encontré la razón. En el archivo posts_controller.rb , no puede poner el método privado en medio de los códigos, lo que significa que todos los métodos a continuación (como mostrar, editar) serán privados. En su lugar, ponga el método privado en la parte inferior de esta manera:
class PostsController < ApplicationController
def new
end
def index
@posts = Post.all
end
def create
@post = Post.new(post_params)
@post.save
redirect_to @post
end
def show
@post = Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title, :text)
end
end
Espero resolver tu problema.
Me he encontrado con este problema para. He comprobado todo el proceso y el código, todo es igual que el tutorial. Al final, en la terminal corro:
rake db:drop,
rake db:create,
rake db:migrate
luego reinicie el servidor, vuelva a abrir el localhost: 3000
Resuelto este problema.
Para mí, el problema solo se resolvió volviendo a ejecutar las rutas bin / rake después de crear show.html.erb. Las instrucciones llamaron para hacer esto antes, pero volver a hacerlo resolvió inmediatamente el problema sin cambiar nada más (ya que mi privacidad era lo último en mi archivo y aún recibía este error).
Sé que esto es antiguo, pero esta fue la primera publicación que apareció al buscar en Google el problema, así que quise ayudar a otros que encontraron su camino hacia este hilo.
Encontré otra forma de solucionar el problema, cambié la palabra clave privada a pública en articles_controller.rb, la guardé y fui a http://localhost:3000/articles/new y creé un nuevo artículo.
Cuando pulsé guardar artículo, se mostró como debía, luego volví y cambié la palabra clave a private y guardé articles_controller.rb, y aún así me permití crear un nuevo artículo por segunda vez, pero esta vez el método era privado. .
También me encontré con el mismo error para el mismo tutorial, y los expertos de Rails ya han respondido la pregunta técnicamente. pero solo quería decir que primero complete un video para entender el concepto y luego intente crearlo con él por segunda vez.
Para el problema anterior, el autor da la solución en el mismo video . De hecho, nos muestra este error en el video con explicación y solución (como es posible que ya lo sepa, pero estoy respondiendo por alguien como yo que visitará esta pregunta por primera vez ). . Está bien entrar en pánico en esta etapa, ya que todos somos nuevos, pero primero entendamos los conceptos en un video y luego hacemos las manos.