неопределенный метод `имя_модели 'для NilClass: Class -NULL значение? - PullRequest
0 голосов
/ 25 января 2012

Приложение My Rails генерирует эту ошибку всякий раз, когда проверка не выполняется:

undefined method `model_name' for NilClass:Class

post_controller.rb :

class PostsController < ApplicationController
  def index
    @posts = Post.all
  end

  def show
    @show_post = Post.find(params[:id])
  end

  def new
    @new_post = Post.new
  end



  def create
     @create_post = Post.new(params[:post])

     if @create_post.save
       redirect_to posts_path, :notice => "Your post was save"
       else
     render "new"
     end
  end




  def edit
    @edit_post = Post.find(params[:id])
  end


  def update
    @update_post = Post.find(params[:id])
    if @update_post.update_attributes(params[:post])
      redirect_to posts_path , :notice => "YOUR POST has been update"
    else
       render "edit"

    end

  end

  def destroy
    @destroy_post = Post.find(params[:id])
    @destroy_post.destroy
    redirect_to posts_path, :notice => "You succressfuly delete #{@destroy_post}"

  end
end

index.html.erb :

<h1>My blog</h1>

<% @posts.each do |post|%>
    <h2><%= link_to post.title, post%></h2>
    <p><%= post.content%></p>
    <p>
        <%= link_to "EDIT", edit_post_path(post)%>
        <%= link_to "Delete", post ,:confirm => "Are you sure?" , :method => :delete%>
    </p>
    <hr>
<% end%>

<p>
    <%= link_to "Add new post", new_post_path %>


</p>

post.rb :

class Post < ActiveRecord::Base
   attr_accessible :title, :content

   validates :title, :content, :presence => true
   validates :title, :length => { :minimum => 2}
   validates :title, :uniqueness =>true

end

Ошибка возникает в следующем контексте:

Extracted source (around line #2):

1: <h1>Add new post</h1>
2: <%= form_for @new_post do |form|%>
3:  <p>
4:      <%= form.label :title%><br />
5:      <%= form.text_field :title%>

Не думаю, что у меня проблема с моим кодом?Или значение просто nil, и поэтому оно приходит с этой ошибкой?

Ответы [ 2 ]

2 голосов
/ 25 января 2012

Хватит это делать: @create_post, @new_post, @show_post, @edit_post и т. Д. И т. Д. *

Начните делать это: @post.

Проблема в том, что ваш объект называется @create_post в вашем create действии. Если модель недействительна, ваше действие создания вызывает render "new". «Новое» представление ожидает установки @new_post, но это не так. @new_post равно nil, а form_for(nil) вызывает ошибку. Вы должны просто вызывать переменную @post в каждом методе, нет усиления для присвоения им имен @create_post или @new_post. Это добавляет бесполезный беспорядок и, в этом случае, ломает вещи.

0 голосов
/ 25 января 2012

Мое предположение: ваша форма является частичной (файл содержит код формы, начинающийся с _), поэтому, когда вы вызываете ее из действия create, переменная @new_post не создается, и вы получаете Ошибка. Вот почему код, сгенерированный rails scaffold, работает: код скаффолда называет переменную @post в действиях new, create, edit и update, поэтому они могут использовать переменную @post в частичный _form, которым они делятся.

В любом случае, когда вы задаете подобные вопросы, лучше, если вы дадите людям больше информации (например, версия Rails и две или три строки ошибки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...