Ruby on rails 如果给定不同的大小写输入,则具有自动完成关联的Rails将失败

Ruby on rails 如果给定不同的大小写输入,则具有自动完成关联的Rails将失败,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,它是Rails 3.0.9应用程序 以下是place模型,其属于与city和address的关联,两者都有多个:places关联。 place模型使用虚拟属性,视图实现jQuery自动完成。其实现方式与Railscasts第102集相同。在cast中,它显示单个类别模型。但是在我的实现中,place模型有两个模型city和address 我已经使用虚拟属性来完成自动完成,如果记录不存在,它必须创建它 class Place < ActiveRecord::Base belongs_to

它是Rails 3.0.9应用程序

以下是
place
模型,其属于与
city
address
的关联,两者都有
多个:places
关联。
place
模型使用虚拟属性,视图实现jQuery自动完成。其实现方式与Railscasts第102集相同。在cast中,它显示单个
类别
模型。但是在我的实现中,
place
模型有两个模型
city
address

我已经使用虚拟属性来完成自动完成,如果记录不存在,它必须创建它

class Place < ActiveRecord::Base
  belongs_to :city
  belongs_to :address

  def city_name
    city.name if city
  end

  def city_name=(name)
    self.city = City.find_or_create_by_name(name) unless name.blank?
  end

  def address_name
    address.name if address
  end

  def address_name=(name)
    self.address = Address.find_or_create_by_name(name) unless name.blank?
  end
end
  • 当我尝试用
    城市名称
    地址名称
    以及数据库中已存储的值创建一个位置时,它运行良好
  • 当我尝试使用不存在的/新的
    城市名称
    地址名称
    进行添加时,它会起作用
  • 当任何一条或两条现有记录和我尝试使用不同的大小写放置时,例如address
    Thamel
    存在,但我放置了
    Thamel
    (小写),它会弹出以下错误报告:
这是日志中的回溯:

Processing by PlacesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"5igpohqctBnRUWjPYu6GnXo6btx8SDe/PJRgF2eTG2A=", "place"=>{"name"=>"aaaa", "image_cache"=>"", "category_id"=>"1", "sub_category_id"=>"2", "hot"=>"0", "featured_till_date"=>"", "opens"=>"11 am", "street"=>"", "address_name"=>"thamel", "city_name"=>"pokhara", "description"=>"sdfdsf"}, "commit"=>"Post my Place"}
  Address Load (0.3ms)  SELECT "addresses".* FROM "addresses" WHERE "addresses"."name" = 'thamel' LIMIT 1
  SQL (0.3ms)  SELECT 1 FROM "addresses" WHERE (LOWER("addresses"."name") = LOWER('thamel')) LIMIT 1
  City Load (0.2ms)  SELECT "cities".* FROM "cities" WHERE "cities"."name" = 'pokhara' LIMIT 1
  SQL (0.3ms)  SELECT 1 FROM "cities" WHERE (LOWER("cities"."name") = LOWER('pokhara')) LIMIT 1
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 11 ORDER BY created_at DESC LIMIT 1
  CACHE (0.0ms)  SELECT "addresses".* FROM "addresses" WHERE "addresses"."name" = 'thamel' LIMIT 1
  CACHE (0.0ms)  SELECT 1 FROM "addresses" WHERE (LOWER("addresses"."name") = LOWER('thamel')) LIMIT 1
  CACHE (0.0ms)  SELECT "cities".* FROM "cities" WHERE "cities"."name" = 'pokhara' LIMIT 1
  CACHE (0.0ms)  SELECT 1 FROM "cities" WHERE (LOWER("cities"."name") = LOWER('pokhara')) LIMIT 1
  SQL (0.3ms)  SELECT 1 FROM "places" WHERE (LOWER("places"."name") = LOWER('aaaa')) LIMIT 1
  CACHE (0.0ms)  SELECT 1 FROM "cities" WHERE (LOWER("cities"."name") = LOWER('pokhara')) LIMIT 1
  CACHE (0.0ms)  SELECT 1 FROM "addresses" WHERE (LOWER("addresses"."name") = LOWER('thamel')) LIMIT 1
  AREL (0.5ms)  INSERT INTO "places" ("user_id", "name", "image", "category_id", "sub_category_id", "opens", "street", "city_id", "address_id", "description", "created_at", "updated_at") VALUES (11, 'Aaaa', NULL, 1, 2, '11 am', '', NULL, NULL, 'sdfdsf', '2011-07-31 15:00:25.182849', '2011-07-31 15:00:25.182849')
SQLite3::ConstraintException: places.city_id may not be NULL: INSERT INTO "places" ("user_id", "name", "image", "category_id", "sub_category_id", "opens", "street", "city_id", "address_id", "description", "created_at", "updated_at") VALUES (11, 'Aaaa', NULL, 1, 2, '11 am', '', NULL, NULL, 'sdfdsf', '2011-07-31 15:00:25.182849', '2011-07-31 15:00:25.182849')
Completed 500 Internal Server Error in 28625ms

ActiveRecord::StatementInvalid (SQLite3::ConstraintException: places.city_id may not be NULL: INSERT INTO "places" ("user_id", "name", "image", "category_id", "sub_category_id", "opens", "street", "city_id", "address_id", "description", "created_at", "updated_at") VALUES (11, 'Aaaa', NULL, 1, 2, '11 am', '', NULL, NULL, 'sdfdsf', '2011-07-31 15:00:25.182849', '2011-07-31 15:00:25.182849')):
  app/controllers/places_controller.rb:39:in `create' 
太奇怪了。当我尝试创建一个不存在的城市名和地址名的地方时,你知道为什么它的行为不符合预期吗

class Place < ActiveRecord::Base
  belongs_to :city
  belongs_to :address

  def city_name
    city.name if city
  end

  def city_name=(name)
    self.city_id = City.find_or_create_by_name(name).id unless name.blank?
  end

  def address_name
    address.name if address
  end

  def address_name=(name)
    self.address_id = Address.find_or_create_by_name(name).id unless name.blank?
  end
end
classplace
像这样尝试:

class Place < ActiveRecord::Base
  belongs_to :city
  belongs_to :address

  def city_name
    city.name if city
  end

  def city_name=(name)
    self.city_id = City.find_or_create_by_name(name).id unless name.blank?
  end

  def address_name
    address.name if address
  end

  def address_name=(name)
    self.address_id = Address.find_or_create_by_name(name).id unless name.blank?
  end
end
classplace
实际上问题出在sqlite3数据库上。
我将db和适配器更改为mysql2,现在同样的代码也可以工作。

实际上问题出在SQLite3DB上。 我将db和适配器更改为mysql2,现在同样的代码也可以工作了