1

在我的 Rails 应用程序中,我有一个用户名模型,它以多态方式附加到 2 个模型小丑和舞者。

创建 Joker 时,表单会发送一个字符串,该字符串是 Joker 的用户名。我应该如何进行设置,以便在接收用户名的字符串而不是 AR 对象时,rails 不会引发错误?

这是我现在拥有的代码。

class Joker < ActiveRecord::Base
  attr_accessible :username

  has_one :username
end

并在创建 Jokers_controller

@joker = Joker.new(params[:joker])

Rails 抛出此错误:

Username(#19110) expected, got String(#9130)

所以这是表单域

= form_for @joker do |f|
  - if @joker.errors.any?
    #error_explanation
      h2 = "#{pluralize(@joker.errors.count, "error")} prohibited this joker from being saved:"
      ul
        - @joker.errors.full_messages.each do |message|
          li = message


  = f.text_field :username
4

2 回答 2

1

问题是因为您username作为文本字段传递,而 Rails 期望它是Username该类的实例。我要做的不是拥有一个Username模型,而是对两者进行验证,DancerJoker检查另一个模型是否存在冲突的用户名。这很简单:

 class Dancer < ActiveRecord::Base
   validate :unique_username

   # your model code goes here

   private

     def unique_username
       if Joker.find_by_username(username)
         errors.add(:username, "is already taken")
       end
     end
  end

因此,删除Username模型和相关表并仅username向两者添加一个字符串字段,dancersjokers在模型中进行此验证。

于 2012-10-30T21:19:32.317 回答
0

我通过将应用程序切换到 mongodb 解决了这个问题。

于 2012-11-25T19:38:32.990 回答