Подтвердить что ты не робот

"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

Спасибо за помощь и интерес!

4b9b3361

Ответ 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, и все же разрешил мне создать новую статью во второй раз, но на этот раз метод был закрыт.