Rails: почему ноль объекта на мой взгляд - PullRequest
2 голосов
/ 13 октября 2011

Я создал очень простое приложение на Rails 3.1 с такими базовыми элементами, как:

My PostsController.rb имеет new, index, create методы:

def index
    @posts = Post.all

    render :index
end
def new
   @post = Post.new
   render :new
end

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

    if @post.save
      render :index

    else
      render :new

    end

  end

Форма new.html.erb :

<%= form_for @post do |f| %>
  <%= f.error_messages%>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :address %><br />
    <%= f.text_field :address, :size=>60 %>
  </p>

  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

представление индекса ( index.html.erb ):

<table>
<% @posts.each do |post| %>
  <tr>
    ...
  </tr>
<% end %>
</table>

my rout.rb определил:

resources :posts
root :to => 'post#new'

Со всем вышеизложенным, когда отправляется новая форма, метод create в PostController *Будет вызываться 1028 *, затем внутри метода create, если новое сообщение успешно сохранено, оно будет render :index, то есть для отображения index.html.erb , все в порядкеточка.но я получил ошибку в index.html.erb view:

Он жалуется, что @ posts в <% @posts.each do |post| %> равен nil почему ???

------------- Я тоже пробовал -------------------------

Я пытался использовать redirect_to posts_path в create методе, затем я получил неопределенный метод `posts_path_url ' Ошибка

Я такжепопытался использовать redirect_to :index в create методе, затем я получил неопределенный метод `index_url ' ошибка

Ответы [ 2 ]

2 голосов
/ 13 октября 2011

Ошибка возникает из-за того, что переменная @posts не установлена ​​в вашем методе Post#create, как в Post#index.Вы должны помнить, что рендеринг вида не вызывает соответствующий метод контроллера.

Вы хотите использовать redirect_to вместо render:

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

    if @post.save
        redirect_to :posts
    else
        render :new
    end
end
0 голосов
/ 13 октября 2011

Это происходит потому, что вызов render не вызывает метод index на контроллере, он только разрешает путь к представлению и отображает его.

Если вы хотите, чтобы @posts присутствовал, вы должны установить его самостоятельно в своем действии создания.

Это хорошо работает с методами new и create по умолчанию (сгенерированными скаффолдами), потому что в обоих действиях вы устанавливаете одну и ту же переменную экземпляра @post. Только в действии create, если проверка не удалась, вы можете мгновенно повторно использовать переменную экземпляра @post, в которой хранятся разные ошибки, и отобразить новый шаблон представления, чтобы показать форму публикации с ошибками.

Если вы хотите перенаправить на действие сообщений, вы должны использовать:

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