【问题标题】:associating two users to a model将两个用户关联到一个模型
【发布时间】:2011-10-24 22:39:14
【问题描述】:

我在让两个用户属于同一模型(票证)时遇到了一点问题。

在我正在构建的错误跟踪器中,工单是需要对项目执行的单个任务项。它有两个用户,Ticket.raised_by 和 Ticket.assigned_to。创建用户

问题是我一直在Tickets#create 操作上引发ActiveRecord::AssociationTypeMismatch 异常,错误消息看起来有点像

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 activerecord model-associations


    【解决方案1】:

    我不确切知道您的身份验证是如何设置的,但我猜您的模型无权访问current_user,因此此代码因此而失败:

    before_create do
      self.raised_by = current_user
    end
    

    有多种方法可以访问模型中的current_user,但存在一些风险(例如,它不是线程安全的)。示例见Access current_user in model

    不过,您可能希望在控制器中处理此问题,而不是使用挂钩来设置用户:

    @ticket = Ticket.create(:raised_by => current_user, .....)
    

    【讨论】:

      【解决方案2】:
      User(#81485590) expected, got String(#68375030)
      

      建议你做错了:

      Ticket.assigned_to = 123
      

      而不是

      Ticket.assigned_to_id = 123
      

      在您的代码中的某处。您可以在分配票证的位置发布视图/控制器代码吗?

      【讨论】:

        【解决方案3】:

        也许current_user 是一个字符串?

        它是如何进入模型的?用户会话是控制器业务。

        【讨论】:

          【解决方案4】:

          在您的表单上,您是否有一个“分配给”字段(可能是一个选择框),其中每个用户的名称作为每个值? 如果是这样,当您在控制器中 update_attributes 时,它会尝试将该字段的字符串值放入 assign_to 关联,这会因您的错误而中断 已经描述过了。

          将该字段重命名为“assigned_to_id”,并确保该字段的值是每个用户的 id,而不是他们的姓名。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-29
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多