2013-02-28 2 views
3

Может кто-нибудь помочь мне с этой ошибкой?undefined метод `collect 'for nil: NilClass

NoMethodError в сообщениях # создать

Показаны C: /Users/User/Documents/website/app/views/posts/_form.html.erb где линия # 24 поднятую:

не определен метод `Collect» для ноля: NilClass

Извлеченные источник (около строки # 24):

23: <% = f.la bel: Категория %
24: <% = f.select: categoria_id, @ categoria.collect {| c | [C.name, c.id]}%>

Трассировка включения шаблона: приложение/просмотров/сообщений/new.html.erb

Мой _form.html.erb

<%= form_for(@post, :html => { :multipart => true }) do |f| %> 
    <% if @post.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@post.errors.count, "error") %> prohibited this post from being saved:</h2> 

     <ul> 
     <% @post.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :titulo %><br /> 
    <%= f.text_field :titulo %> 
    </div> 
    <div class="field"> 
    <%= f.label :conteudo %><br /> 
    <%= f.text_area :conteudo %> 
    </div> 
    <div class="field"> 
    <%= f.label :categoria %><br /> 
    <%= f.select :categoria_id, @categoria.collect { |c| [ c.name, c.id ] } %> 
    </div> 
    <br /> 
    <div class="field"> 
    <%= f.file_field :avatar %> 
    </div> 
    <br /> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
    <br /> 
<% end %> 

Мой контролер:

class PostsController < ApplicationController 
    # GET /posts 
    # GET /posts.json 
    def index 
    @posts = Post.all 
    respond_to do |format| 
     format.html # index.html.erb 
     format.json { render json: @posts } 
    end 
    end 

    # GET /posts/1 
    # GET /posts/1.json 
    def show 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     format.html # show.html.erb 
     format.json { render json: @post } 
    end 
    end 

    # GET /posts/new 
    # GET /posts/new.json 
    def new 
    @post = Post.new 
    @categoria = Categorium.all 
    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @post } 
    end 
    end 

    # GET /posts/1/edit 
    def edit 
    @post = Post.find(params[:id]) 
    @categoria = Categorium.all 
    end 

    # POST /posts 
    # POST /posts.json 
    def create 
    @post = Post.new(params[:post]) 

    respond_to do |format| 
     if @post.save 
     format.html { redirect_to @post, notice: 'Post was successfully created.' } 
     format.json { render json: @post, status: :created, location: @post } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # PUT /posts/1 
    # PUT /posts/1.json 
    def update 
    @post = Post.find(params[:id]) 

    respond_to do |format| 
     if @post.update_attributes(params[:post]) 
     format.html { redirect_to @post, notice: 'Post was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: "edit" } 
     format.json { render json: @post.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /posts/1 
    # DELETE /posts/1.json 
    def destroy 
    @post = Post.find(params[:id]) 
    @post.destroy 

    respond_to do |format| 
     format.html { redirect_to posts_url } 
     format.json { head :no_content } 
    end 
    end 
end 
+0

Можете ли вы опубликовать свою модель «Категорий»? Кажется, что '@ categoria' возвращает' nil', несмотря на то, что он явно создается из вашей базы данных в методе 'posts # new'. –

ответ

13

Ваше new действие определяет @categoria, который затем используется на ваш взгляд.

Если ваше действие create создает недопустимый объект, оно будет повторно отображать вид new, который все еще ожидает определения @categoria, но это не так.

Необходимо определить переменную экземпляра как в действиях new, так и create.

+0

Я вижу это сейчас. Он сделал «render» вместо «redirect_to». Сохраняет ли это содержание формы? –

+0

Да, это необходимо, чтобы данные, предоставленные в форме, повторно отображали его, а также сохраняли сообщения об ошибках для отображения. Если бы он перенаправлялся на новый, все, что вы получили, было бы пустой формой, возможно, с флэш-сообщением. Не очень приятный пользовательский интерфейс. – sevenseacat

+0

Спасибо, человек, это было мое отсутствие внимания – user1211674

0

Куда творят действия? Вы определили новое действие, но не создали действие в своем контроллере. Действие create - это то, что сохранит ваш объект.

+0

create это не недостающий метод. @categoria возвращает ноль. –

+0

Да, @categoria - это нуль, но большая проблема заключается в том, что объект не сохраняется. Я должен был спросить также, есть ли у «Категориума» существующие значения, хотя ... –

+0

Действительно? Он, должно быть, добавил метод создания в код после того, как вы разместили его. Это сейчас. –

-1

У вас есть categoria? Это единственная причина, по которой я могу думать, почему @categoria вернет нуль в ваш взгляд.

0
<%= f.select :categoria_id, options_for_select(@categoria, :name, :id), :required => true %> 
+0

Это не разрешает проблему '@ categoria' быть nil. – sevenseacat

0

Вы должны определить @categoria = Categoria.all переменную экземпляра в новых, создавать, редактировать, обновлять действия в контроллере.

Смежные вопросы