привязка двух пользователей к модели - PullRequest
0 голосов
/ 25 октября 2011

У меня возникли некоторые проблемы, когда два пользователя принадлежат к одной и той же модели (Ticket).

В построенном мной трекере ошибок Ticket - это отдельный элемент задачи, который необходимосделано для проекта.К нему прикреплены два пользователя, Ticket.raised_by и Ticket.assigned_to.Создающий пользователь

Проблема в том, что я последовательно получаю исключение ActiveRecord::AssociationTypeMismatch, выдаваемое в действии Tickets#create, с сообщением об ошибке, которое выглядит примерно так:

User(#81485590) expected, got String(#68375030)

Вот код для Ticket.rb:

    # Table name: tickets
    #
    #  id             :integer         not null, primary key
    #  title          :string(255)
    #  description    :text
    #  status         :string(255)     default("open")
    #  priority       :boolean         default(FALSE)
    #  project_id     :integer
    #  raised_by_id   :integer         default(0)
    #  assigned_to_id :integer         default(0)
    #  created_at     :datetime
    #  updated_at     :datetime

    class Ticket < ActiveRecord::Base
      validates :title,   :presence => true
      validates :status,  :presence => true
      belongs_to :project
      belongs_to :raised_by,    :foreign_key => 'raised_by_id',   :class_name => 'User'
      belongs_to :assigned_to,  :foreign_key => 'assigned_to_id', :class_name => 'User'

      before_create do
        self.raised_by = current_user
      end

      state_machine :status, :initial => 'open' do
        # when a ticket is "claimed" by a developer
        event :work do
          transition any => :working_on
        end

        # posted the solved ticket to the dev server (or VM)
        event :post do
          transition any => :posted
        end

        # ticket is under review by another developer
        event :review do
          transition any => :reviewed
        end

        # review is completed and confirmed. only reviewed or flagged tasks can be completed.
        event :complete do
          transition [:review, :flagged] => :completed
        end

        # occurs when the project is completed
        event :close do
          transition any => :closed
        end

        # Special treatment for administrators. Sends them a Message detailing the flagged issue.
        event :flagged do
          transition any => :flagged
        end
      end
    end

Ответы [ 4 ]

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

Я не знаю точно, как настроена ваша аутентификация, но я предполагаю, что ваша модель не имеет доступа к current_user, поэтому этот код не выполняется из-за этого:

before_create do
  self.raised_by = current_user
end

Есть способы доступа к current_user в вашей модели, но есть некоторый риск (например, это не безопасно для потоков). См. Доступ к current_user в модели для примера.

Вместо того, чтобы использовать ловушку для установки пользователя, вы можете вместо этого обработать это в контроллере:

@ticket = Ticket.create(:raised_by => current_user, .....)
0 голосов
/ 25 октября 2011

В вашей форме, есть ли у вас случайно поле "назначено" (вероятно, поле выбора) с именем каждого пользователя в качестве каждого значения? Если это так, когда вы обновляете в своем контроллере update_attributes, он будет пытаться поместить строковое значение этого поля в ассоциацию assign_to, что приводит к ошибке, которую вы описал.

Переименуйте поле в "assign_to_id" и убедитесь, что значением поля является идентификатор каждого соответствующего пользователя, а не его имя.

0 голосов
/ 25 октября 2011

Может быть current_user это строка?

Как он вообще попал в модель? Пользовательские сессии - это бизнес контроллеров.

0 голосов
/ 25 октября 2011
User(#81485590) expected, got String(#68375030)

предположить, что вы делаете неправильно:

Ticket.assigned_to = 123

вместо

Ticket.assigned_to_id = 123

где-то в вашем коде. Можете ли вы опубликовать код вида / контроллера, где вы назначаете билет?

...