ruby on rails - Rails4 Action Controller - undefined method 'length' for nil:NilClass -
i'm building messaging system scratch 1 of projects. working had following error: nomethoderror in messagescontroller#index
followed undefined method 'length' nil:nilclass
. couldn't find answer correspond case, unfortunately.
i give conversations_controller.rb
, messages_controller.rb
, models , routes (and logs):
conversations_controller.rb
class conversationscontroller < applicationcontroller before_action :authenticate_user! def index @users = user.all @conversations = conversation.all end def create if conversation.between(params[:sender_id], params[:recipient_id]).present? @conversation = conversation.between(params[:sender_id], params[:recipient_id]).first else @conversation = conversation.create!(conversation_params) end redirect_to conversation_messages_path(@conversation) end private def conversation_params params.permit(:sender_id, :recipient_id) end end
messages_controller.rb :
class messagescontroller < applicationcontroller def index if @messages.length > 10 @over_ten = true @messages = @messages[-10..-1] end if params[:m] @over_ten = false @messages = @conversation.messages end if @messages.last if @messages.last.user_id != current_user.id @messages.last.read = true; end end @message = @conversation.messages.new end def new @message = @conversation.messages.new end def create @message = @conversation.messages.new(message_params) if @message.save redirect_to conversation_messages_path(@conversation) end end private def message_params params.require(:message).permit(:body, :user_id) end end
conversation.rb :
class conversation < activerecord::base belongs_to :sender, foreign_key: :sender_id, class_name: 'user' belongs_to :recipient, foreign_key: :recipient_id, class_name: 'user' has_many :messages, dependent: :destroy validates_uniqueness_of :sender_id, scope: :recipient_id scope :between, -> (sender_id,recipient_id) where("(conversations.sender_id = ? , conversations.recipient_id = ?) or (conversations.sender_id = ? , conversations.recipient_id = ?)", sender_id,recipient_id, recipient_id,sender_id) end end
message.rb :
class message < activerecord::base belongs_to :conversation belongs_to :user validates_presence_of :body, :conversation_id, :user_id def message_time created_at.strftime("%m/%d/%y @ %l:%m %p") end end
routes.rb :
rails.application.routes.draw 'messages/index' 'messages/new' 'conversations/index' 'dashboard/index' 'dashboard/trips' 'dashboard/messages' "welcome/index" resources :conversations resources :messages end devise_for :users authenticated :users root to: 'dashboard#index', as: :authenticated_root end root "welcome#index" end
here, logs:
started "/conversations/5/messages" ::1 @ 2016-11-13 16:45:38 +1030 processing messagescontroller#index html parameters: {"conversation_id"=>"5"} completed 500 internal server error in 5ms (activerecord: 0.0ms) nomethoderror (undefined method `length' nil:nilclass): app/controllers/messages_controller.rb:4:in `index' rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/_source.erb (3.7ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.1ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.7ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/actionpack-4.2.6/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (53.1ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/_markup.html.erb (0.5ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/_inner_console_markup.html.erb within layouts/inlined_string (0.3ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/_prompt_box_markup.html.erb within layouts/inlined_string (0.4ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/style.css.erb within layouts/inlined_string (0.3ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/console.js.erb within layouts/javascript (40.4ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/main.js.erb within layouts/javascript (0.4ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/error_page.js.erb within layouts/javascript (0.7ms) rendered /users/justine/.rvm/gems/ruby-2.3.0/gems/web-console-2.3.0/lib/web_console/templates/index.html.erb (91.6ms)
i hope helpful , able find answer :)
cheers
the @messages
instance variable in messagescontroller
not set. need initialize first current_user.messages
:
def index @messages = current_user.messages # or if @messages.length > 10 @over_ten = true # ...
Comments
Post a Comment