Я собираюсь перейти непосредственно к вопросу, который заключается в том, что согласно моему файлу журнала, когда я отправляю форму для создания новой записи, все параметры отправляются правильно, но некоторые атрибуты не могут быть установлены, когда создание записи в базе данных. Ниже приводится соответствующая запись в журнале:
Started POST "/computers" for 192.168.8.70 at 2011-05-19 16:24:31 -0400
Processing by ComputersController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"agR6MrYbMTbXeR9+Oit0rUzrhcKuhg6p/jpGqQD9MhI=", "show_location_buttons"=>"1", "computer"=>{"vendor_id"=>"1", "new_vendor_name"=>"", "model"=>"Hello", "hostname"=>"Hello", "user_id"=>"", "computer_type"=>"Desktop", "serial_number"=>"", "unh_id"=>"", "doc_id"=>"", "federal"=>"0", "department_id"=>"", "new_department_name"=>"", "security_id"=>"", "purchase_price"=>"", "purchase_date"=>"05/11/2011", "warranty_expiration"=>"05/28/2011", "activity_id"=>"", "new_activity_code"=>"", "condition_id"=>"", "new_condition_name"=>"", "location_id"=>"", "operating_system"=>"Fedora Core", "comments"=>""}, "commit"=>"Create Computer"}
User Load (0.1ms) SELECT `users`.* FROM `users` WHERE `users`.`id` = 48 LIMIT 1
SQL (0.1ms) BEGIN
SQL (0.4ms) SHOW TABLES
Computer Load (0.2ms) SELECT `computers`.`id` FROM `computers` WHERE (`computers`.`hostname` = BINARY 'Hello') LIMIT 1
Vendor Load (0.1ms) SELECT `vendors`.* FROM `vendors` WHERE `vendors`.`id` = 1 LIMIT 1
SQL (0.7ms) describe `computers`
AREL (0.3ms) INSERT INTO `computers` (`vendor_id`, `model`, `hostname`, `computer_type`, `serial_number`, `unh_id`, `doc_id`, `federal`, `department_id`, `security_id`, `purchase_price`, `purchase_date`, `warranty_expiration`, `activity_id`, `condition_id`, `location_id`, `operating_system`, `license_sticker_id`, `comments`, `created_at`, `updated_at`, `user_id`, `delta`) VALUES (1, 'Hello', 'Hello', 'Desktop', '', '', '', 0, NULL, NULL, NULL, '2011-11-05', NULL, NULL, NULL, NULL, 'Fedora Core', NULL, '', '2011-05-19 20:24:31', '2011-05-19 20:24:31', NULL, 1)
Если вы присмотритесь, параметр для "Guarantee_expiration" был задан в хэше параметров, но если вы посмотрите на строку AREL в журнале, вставка в базу данных сбрасывает значение поля Warranty_expiration и вставляет NULL. Я совершенно ошеломлен этим. Есть мысли?
Ниже приведены моя модель и код контроллера для ресурса «Компьютер»:
computer.rb
class Computer < ActiveRecord::Base
before_validation :format_fields
validates :model, :presence => true
validates :hostname, :presence => true, :uniqueness => true, :format => { :with => /^[a-zA-Z0-9]{3,25}$/ }
validates :computer_type, :presence => true
validates :operating_system, :presence => true
validate :required_fields_specified
belongs_to :vendor
belongs_to :department
belongs_to :security
belongs_to :activity
belongs_to :condition
belongs_to :location
belongs_to :license_sticker
belongs_to :user
has_many :hardware_addresses, :as => :addressable
accepts_nested_attributes_for :hardware_addresses, :allow_destroy => true, :reject_if => lambda { |attr| attr[:mac_address].blank? }
has_many :license_stickers, :dependent => :destroy
accepts_nested_attributes_for :license_stickers, :allow_destroy => true, :reject_if => lambda { |attr| attr[:key].blank? or attr[:operating_system].blank? }
has_many :pictures, :as => :imageable, :dependent => :destroy
accepts_nested_attributes_for :pictures, :allow_destroy => true
attr_accessor :new_vendor_name
attr_accessor :new_activity_code
attr_accessor :new_department_name
attr_accessor :new_condition_name
before_save :create_vendor_from_name
before_save :create_activity_from_code
before_save :create_department_from_name
before_save :create_condition_from_name
OPERATING_SYSTEMS = ["Microsoft Windows XP x86", "Microsoft Windows 7 x86", "Microsoft Windows Server 2003",
"Microsoft Windows XP x64", "Microsoft Windows 7 x64", "Microsoft Windows Server 2008 x86",
"Microsoft Windows Vista x86", "Microsoft Windows Vista x64", "Microsoft Windows Server 2008 x64",
"Ubuntu 8.x", "Ubuntu 9.x", "Ubuntu 10.x", "Fedora Core", "CentOS 5.x x86", "CentOS 4 x86", "IRIX",
"MacOS 10.5", "MacOS 10.6", "MacOS 10.7","CentOS 4 x64", "CentOS 5 x64", "ESX 3", "ESX 4", "SUSE"]
COMPUTER_TYPES = ["Desktop","Laptop","Server"]
def required_fields_specified
errors.add_to_base "Specify an existing vendor, or create one." if vendor.blank? and new_vendor_name.blank?
end
def create_vendor_from_name
create_vendor(:name => new_vendor_name) unless new_vendor_name.blank?
end
def create_activity_from_code
create_activity(:code => new_activity_code) unless new_activity_code.blank?
end
def create_department_from_name
create_department(:name => new_department_name) unless new_department_name.blank?
end
def create_condition_from_name
create_condition(:name => new_condition_name) unless new_condition_name.blank?
end
def format_fields
serial_number.upcase!
hostname.capitalize!
self.model = self.model.titleize
unh_id.upcase!
doc_id.upcase!
end
define_index do
indexes vendor(:name), :as => :vendor_name, :sortable => true
indexes model, :sortable => true
indexes hostname, :sortable => true
indexes computer_type, :sortable => true
indexes serial_number, :as => :serial, :sortable => true
indexes operating_system, :as => :os, :sortable => true
indexes activity(:code), :as => :activity_code
indexes condition(:name), :as => :condition_name
indexes department(:name), :as => :department_name
indexes license_sticker(:key), :as => :license_key
indexes license_sticker(:operating_system), :as => :licensed_os
has warranty_expiration, :as => :warranty
set_property :delta => true
end
end
computers_controller.rb
class ComputersController < ApplicationController
filter_access_to :all
# GET /computers
# GET /computers.xml
def index
@computers = Computer.search params[:search], :order => sort_column("computer_type"), :sort_mode => sort_direction,
:per_page => 20, :page => params[:page], :star => true
respond_to do |format|
format.html # index.html.erb
format.js
format.xml { render :xml => @computers }
end
end
# GET /computers/1
# GET /computers/1.xml
def show
@computer = Computer.find(params[:id])
respond_to do |format|
format.html # show.html.erb
format.xml { render :xml => @computer }
end
end
# GET /computers/new
# GET /computers/new.xml
def new
@computer = Computer.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @computer }
end
end
# GET /computers/1/edit
def edit
@computer = Computer.find(params[:id])
end
# POST /computers
# POST /computers.xml
def create
@computer = Computer.new(params[:computer])
respond_to do |format|
if @computer.save
format.html { redirect_to(@computer, :notice => 'Computer was successfully created.') }
format.xml { render :xml => @computer, :status => :created, :location => @computer }
else
format.html { render :action => "new" }
format.xml { render :xml => @computer.errors, :status => :unprocessable_entity }
end
end
end
# PUT /computers/1
# PUT /computers/1.xml
def update
@computer = Computer.find(params[:id])
respond_to do |format|
if @computer.update_attributes(params[:computer])
format.html { redirect_to(@computer, :notice => 'Computer was successfully updated.') }
format.xml { head :ok }
else
format.html { render :action => "edit" }
format.xml { render :xml => @computer.errors, :status => :unprocessable_entity }
end
end
end
# DELETE /computers/1
# DELETE /computers/1.xml
def destroy
@computer = Computer.find(params[:id])
@computer.destroy
respond_to do |format|
format.html { redirect_to(computers_url) }
format.xml { head :ok }
end
end
private
# def sort_column
# params[:sort] || "computer_type"
# end
# def sort_direction
# if params[:direction].nil?
# :asc
# else
# params[:direction].to_sym
# end
# end
end
ОБНОВЛЕНИЕ: Результат выполнения запрошенной строки в консоли rails ниже.
ruby-1.9.2-p180: 002>
Computer.create! "VENDOR_ID" => "1",
"New_vendor_name" => "",
"model" => "Hello", "hostname" => "Heo",
"User_id" => "",
"Computer_type" => "Рабочий стол",
"serial_number" => "", "unh_id" => "",
"doc_id" => "", "Federal" => "0",
"Department_id" => "",
"New_department_name" => "",
"Security_id" => "",
"Purchase_price" => "",
"ПОКУПКА" => "05/11/2011",
"Warranty_expiration" => "05/28/2011",
"Activity_id" => "",
"New_activity_code" => "",
"Condition_id" => "",
"New_condition_name" => "",
"LOCATION_ID" => "",
"operating_system" => "Fedora Core",
"comments" => "" Sphinx 0.9.9-release
(r2117) Copyright (c) 2001-2009,
Андрей Аксёнов
с использованием файла конфигурации
'/Opt/intranet3-dev/config/development.sphinx.conf' ...
Индексирование индекса 'computer_delta' ...
собрано 2 документа, 0,0 МБ отсортировано 0,0
Mhits, 100,0% сделано всего 2 документа, 62
Всего байтов 0,016 с, 3724 байт / с,
120,15 документов в секунду, всего 20 операций чтения, 0,000 секунд, 0,0 кбит / с на вызов, 0,0 мс / вызов
в среднем всего 10 записей, 0,000 с, 0,4
кб / ср. звонка, 0,0 мсек / ср. звонка
вращающиеся индексы: успешно отправлено
SIGHUP для поиска (pid = 25435). =>
computer_type: "Рабочий стол",
serial_number: "", unh_id: "", doc_id:
"", федеральный: false, отдел_ид:
ноль, security_id: ноль, покупка_цена:
ноль, дата покупки: "2011-11-05",
гарантийный срок: ноль, идентификатор_ активности:
ноль, условие_ид: ноль, расположение_ид:
nil, operating_system: "Fedora Core",
license_sticker_id: ноль, комментарии: "",
create_at: "2011-05-19 21:17:55",
updated_at: "2011-05-19 21:17:55",
user_id: nil, delta: true>
Спасибо за помощь,
Les