2015-12-10 4 views
-2

Существует контроллер сообщений:неопределенный метод `model_name» для ноль: NilClass

class MessagesController < ApplicationController 
    before_filter :load_chat 

    def index 
    @messages = @chat.messages 
    end 

    def create 
    @message = @chat.messages.build(params[:message]) 
    if @message.save 
     redirect_to @chat, notice: "Message sent" 
    else 
     render :new 
    end 
    end 

    private 

    def load_chat 
     @chat = Chat.find(params[:chat_id]) 
    end 

end 

Вот мой вид файла:

%h1 = @chat.name 

= content_tag :div, id: 'messages', data: {url: chat_messages_path(@chat)} do 
    = render @chat.messages 


%h2 New message 

= render 'messages/form' 

Вот мои сообщения/форма:

= simple_form_for @message do |f| 
    = f.input :text 
    = f.submit 'Send message', class: 'btn btn-success' 

И, наконец, мой route.rb файл:

resources :chats, only: [:index, :show, :new, :create] do 
     resources :messages 
end 

Так что проблема в том, что я получаю сообщение об ошибке undefined method model_name for nil:NilClass, когда я открываю чаты/показать ссылку, потому что есть визуализация формы нового сообщения. Я попытался заменить @messageMessage.new, который не выполняет эту работу, по-прежнему та же проблема. Я попробовал также удалить resources :messages за пределами resources :chats, что сделало трюк, но это неверно, потому что чаты имеют много сообщений и сообщений, принадлежащих чату. Вы знаете, как эта форма должна работать на меня? контроллер Чаты::

Редактировать

class ChatsController < ApplicationController 
    before_action :find_chat, :authenticate_user! 


    def index 
    @chats = current_user.chats 
    end 

    def show 
    @chat = current_user.chats.find(params[:id]) 
    end 

    def new 
    @chat = current_user.chats.new 
    end 

    def create 
    @chat = current_user.chats.new chat_params 
    if @chat.save 
     flash[:notice] = 'chat asked' 
     redirect_to chats_path 
    else 
     render 'new' 
    end 
    end 

    def edit 
    end 

    def destroy 
    @chat.destroy! 
    flash[:notice] = 'chat deleted' 
    redirect_to chats_path 
    end 

    def update 
    if @chat.update_attributes chat_params 
     flash[:notice] = 'chat saved' 
     redirect_to chat_path 
    else 
     redirect_to edit_chat_path(@chat) 
    end 
    end 

    private 
    def chat_params 
     params.require(:chat).permit :name, :user_id 
    end 

    def find_chat 
     @chat = current_user.chats.find(params[:id]) if params[:id] 
    end 
end 

И мой журнал ошибок:

ActionView::Template::Error (undefined method `model_name' for nil:NilClass): 
    1: = simple_form_for @message do |f| 
    2: = f.input :text 
    3: = f.submit 'Send message', class: 'btn btn-success' 
    4:  app/views/messages/_form.html.haml:1:in `_app_views_messages__form_html_haml___2629708334715527453_82911540' app/views/chats/show.html.haml:9:in `_app_views_chats_show_html_haml__2381438814653998256_88403540' 


    Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_source.erb (10.9ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (3.9ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (3.2ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/actionpack-4.2.4/lib/action_dispatch/middleware/templates/rescues/template_error.html.erb within rescues/layout (35.7ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/_markup.html.erb (0.6ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (0.5ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (0.5ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/style.css.erb within layouts/inlined_string (0.9ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/console.js.erb within layouts/javascript (23.0ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/main.js.erb within layouts/javascript (0.5ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/error_page.js.erb within layouts/javascript (0.5ms) Rendered /home/titas/.rvm/gems/ruby-2.2.1/gems/web-console-2.2.1/lib/web_console/templates/index.html.erb (42.8ms) 
+2

Пожалуйста, отправьте исходный код 'ChatsController' и ваш журнал ошибок. – Aetherus

+0

@Aetherus обновлен :) –

+0

Изменить @ chat.messages.build (params [: message]) на @ chat.messages.new (params [: message]) и simple_form_for @message do | f | to simple_form_for: message, url: ваш url do | f | –

ответ

0

не мог видеть, где вы объявляя @message?

-

Ошибка будет приходить с:

= render 'messages/form' 

... который имеет:

= simple_form_for @message do |f| 

-

Помимо этого быть плохая практика использовать @instance_variables в частицах, в этом случае вам нужно будет объявить @message явно для его распознавания.

Я на самом деле думаю, что вы могли бы решить эту проблему, передавая вложенный ресурс в messages/form парциальный:

#app/views/messages/_form.html.erb 
= simple_form_for [@chat, @chat.messages.new] do |f| 

(Кстати, все nilClass ошибки в основном означают, что вы ссылаетесь на переменную, которая не имеет были объявлены)

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