Я решил добавить слаги к своим URL-адресам, я добавил столбец с именем «slug», создал миграцию, успешно перенес ее, проверил наличие столбца в базе данных:
Но я не могу создавать записи, потому что получаю следующую ошибку:
NoMethodError: неопределенный метод `slug=' для #Hotel:0x3d19a60
Я использую библиотеку friendly_id, но эта проблема, вероятно, не связана с самой библиотекой. В любом случае, вот некоторые важные данные:
- Версия Rails: 4.2.4
- Версия Ruby: 2.1.7
- Версия идентификатора друзей: 5.1.0
- База данных: Postgres 9.3.5
Часть класса модели отеля:
class Hotel < ActiveRecord::Base
extend FriendlyId
friendly_id :generate_slug, use: :slugged
def generate_slug
"#{self.name} #{self.id}"
end
def should_generate_new_friendly_id?
name_changed? || new_record?
end
def normalize_friendly_id(text)
super(I18n.transliterate(text))
end
Часть кода, где выдается ошибка при вызове сохранения (данные скрыты):
rest = Hotel.new(:name => "*", :telephone => "*", :email => "*", :web_page => "*", :state => 1, :city_search => "*", :smoking => *,
:address_attributes => {:city => "*", :street => "*", :postal_code => "*", :country_code => "*"})
ObjectSkipValidator.setup_validations(rest, nil)
rest.save!
Конечно, в таблице есть столбец slug, моя миграция:
AFFECTED_TABLES = [:restaurants, :hotels]
def change
AFFECTED_TABLES.each do |tab|
add_column tab, :slug, :string
add_index tab, :slug, unique: true
end
end
Я попытался переопределить ActiveRecord, чтобы увидеть, в чем проблема, и похоже, что хэш атрибутов, который необходим в методе attribute_missing, не содержит столбец «слаг», но все остальные столбцы присутствуют.
ActiveRecord::AttributeSet::Builder.build_from_database — при вызове значения не содержат краткий столбец
Также эта часть метода ActiveModel::AttributeMethods.method_missing:
match = match_attribute_method?(method.to_s)
match ? attribute_missing(match, *args, &block) : super
Никогда не вызывает attribute_missing, поэтому для этого конкретного столбца не создаются геттеры и сеттеры, потому что сопоставитель не смог найти столбец-слаг.
Итак, почему я не могу получить доступ или установить атрибут «slug» в своей модели? Спасибо за любые ответы.
РЕДАКТИРОВАТЬ: благодаря комментарию Шона похоже, что проблема возникла за несколько шагов до заполнения базы данных. В этой задаче выполняется заполнение - я использовал его в течение длительного времени без каких-либо проблем - во время задачи db: populate выдается ошибка:
task prepare_all: :environment do
puts "==== PREPARING DATABASE ===="
Rake::Task["db:drop"].invoke()
Rake::Task["db:create"].invoke()
Rake::Task["db:migrate"].invoke()
Rake::Task["db:populate"].invoke()
Rake::Task["db:codetables_populate"].invoke()
Rake::Task["db:geocode"].invoke()
puts "==== DATABASE PREPARED ===="
end
Задание выполняется с помощью:
bundle exec rake db:prepare_all RAILS_ENV=development
Если я запускаю задачи одну за другой, например. db:drop, db:create, db:migrate, db:populate, все работает как положено и создаются слаги. Похоже, вызов задач так, как я это делаю, неверен.
Hotel.column_names.include?('slug')
? - person Sean Huber   schedule 08.04.2016ActiveRecord::Base.connection.execute("SELECT
version` FROMschema_migrations
ORDER BYschema_migrations
.version
DESC LIMIT 1).first[0]` Какая отметка времени у вашей миграции? Какая версия определена вdb/shema.rb
? Вы уверены, что ваша среда Rails подключается к правильной базе данных? - person Sean Huber   schedule 08.04.2016