"undefined метод` title 'для nil: NilClass" Rails Guides Tutorial
Я работаю над RailsGuides Tutorial (созданием приложения для блога). Когда я запускаю сервер и открываю: /posts/new
все выглядит нормально. Но, когда я пытаюсь создать сообщение, я получаю эту ошибку:
NoMethodError в сообщениях # show
Отображение/home/darek/rails_projects/blog/app/views/posts/show.html.erb, где строка # 3 поднятый:
undefined метод `title 'для nil: NilClass
Извлеченный источник (вокруг строки # 3):
1 <p>
2 <strong>Title:</strong>
3 <%= @post.title %>
4 </p>
5 <p>
Фактически создается пост, и я могу видеть заголовок и контент на/сообщениях
Но когда я пытаюсь использовать специальный пост, я получаю эту ошибку.
Моя первая подсказка заключалась в том, чтобы изменить строку
<%= @post.title %>
to
<%= @post.try(:title) %>
Ошибка исчезла, но проблема не решена.
Когда я пытаюсь показать конкретный пост, я получаю Title и Text form empty. Это не то, что я хочу видеть;)
Хорошо, вот код
show.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
Графические маршруты:
-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
Спасибо за помощь и интерес!
Ответы
Ответ 1
вы сделали свои методы частными. Помните, где вы добавляете закрытое ключевое слово. все нижеприведенные методы станут частными, определите ваши методы следующим образом. частные методы в конце контроллера:
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
Надеюсь, это поможет. Благодаря
Ответ 2
Я встретил ту же проблему, что и вы, следуя руководству. И я снова проверил свои коды, затем нашел причину. В файле posts_controller.rb вы не можете поместить закрытый метод в середину кодов, это означает, что все приведенные ниже методы (например, show, edit) будут закрытыми. Вместо этого добавьте частный метод внизу:
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
Надеюсь решить вашу проблему.
Ответ 3
В моем случае я не писал эту строку ниже определения класса (maps_controller):
class MapsController < ApplicationController
before_action :set_map, only: [:show, :edit, :update,:destroy]
...
end
Карта - моя модель, после написания этой строки, Мое представление сработало. Будьте осторожны, чтобы не публиковать открытый код под частными методами.
Ответ 4
Я встречаю эту проблему. Я проверил весь процесс и код, все так же, как и в учебнике.
В конце концов, в терминале я запускаю:
rake db:drop,
rake db:create,
rake db:migrate
затем перезагрузите сервер, снова запустите localhost: 3000
решил эту проблему.
Ответ 5
У учебника есть опечатка, потому что я выполнил эти же шаги и разрешил ту же проблему. Тем не менее, я следил за учебником
def create
@post = Post.new(post_params)
@post.save
redirect_to @post
end
private
def post_params
params.require(:post).permit(:title, :text)
end
Ответ 6
Для меня проблема была решена только путем повторного выполнения маршрутов bin/rake после создания show.html.erb. Инструкции, которые были сделаны для этого раньше, но повторное выполнение этого решения сразу же решило проблему, не изменив ничего (поскольку мой личный был последним в моем файле, и я все еще получал эту ошибку).
Ответ 7
Я тоже столкнулся с той же ошибкой для одного и того же учебника, и эксперты уже рельсы уже ответили на вопрос технически.
но я просто хотел сказать, что сначала закончил одно видео, чтобы понять концепцию, а затем второй раз попытаюсь создать с ним.
для вышеизложенного автор дает решение в том же видео. Фактически, он показывает нам эту ошибку в видео с объяснением и решением (как уже мог уже знать сейчас, но я отвечаю за кого-то как я, который будет посещать этот вопрос в первый раз). Его нормально паниковать на этом этапе, поскольку все мы новы, но давайте сначала понять концепции в видео, а затем сделать ладони.
Ответ 8
Я знаю, что это уже давно, но это было первое сообщение, которое появилось при переходе к проблеме, поэтому я хотел помочь другим, которые нашли свой путь к этой теме.
Я нашел еще один способ исправить проблему, я изменил ключевое слово private на public в article_controller.rb, сохранил его и перешел в http://localhost:3000/articles/new
и создал новую статью.
Когда я ударил статью, она показалась так, как предполагалось, затем я вернулся и сменил ключевое слово на приватное и сохраненное article_controller.rb, и все же разрешил мне создать новую статью во второй раз, но на этот раз метод был закрыт.