Ошибка Rails: «Не удалось сравнить пользователя с пользователем» - PullRequest
2 голосов
/ 28 марта 2012

Я получаю следующую ошибку в моем приложении rails:

comparison of User with User failed

Соответствующий раздел моего контроллера выглядит следующим образом:

class AssessmentsController < ApplicationController
  before_filter :authenticate_user!
  respond_to :html, :xml, :js, :pdf

def index
  @user = current_user
  @account = Account.find(@user.account_id)
  @assessments = Assessment.all
  respond_with @assessments
end

соответствующий раздел моего взгляда выглядит следующим образом:

<%= form_for(@account) do |a| %>

<%= a.fields_for :users, @account.users.build do |u| %>

....
<%= a.submit "Sign-up", :class => "button", :disable_with => "Saving..." %>

<% end %>

<h1>Current users</h1>

<% for @user in @account.users.sort! { |b,a| a.id <=> b.id } %>
<%= render :partial => 'user' %>
<% end %>

Кажется, что ошибка возникает вокруг секции for @user in @account.users.sort! в соответствии с моделью ошибки, но ее удаление, по-видимому, является добавлением @account.users.build враздел fields_for, который его создает (но мне это нужно, поскольку я хочу, чтобы пользователь мог создать нового пользователя для этой учетной записи. Может ли кто-нибудь объяснить мне, что это создает?

1 Ответ

9 голосов
/ 28 марта 2012

Ошибка действительно происходит в этой строке, потому что модели ActiveRecord не реализуют сопоставимые по умолчанию.Поэтому, когда вы говорите @account.users.sort!, сортировка срывается, поскольку у нее нет возможности сравнивать пользователей с пользователями.

Здесь можно сделать две вещи:

  1. Реализацияоператор сравнения для вашей пользовательской модели.Проверьте эту ссылку для записи в блоге о том, как это сделать, но это будет что-то вроде:

    class User < ActiveRecord::Base
    
      def <=>(other)
        self.name <=> other.name
      end
    
    end
    
  2. Скажите напрямую сортировке, какое сравнение сиспользуйте, как это:

    @account.users.sort! {|a, b| a.name <=> b.name}
    
...