Использование дружественного идентификатора и i18n с update_attributes приводит к перезаписи

Использование: - Rails 3.0.3 - Friendly_id 4.0.0 Beta 11 - Windows - i18n (0.6.0, 0.5.0) согласно "списку драгоценных камней"

Настройка: у меня есть многоязычный веб-сайт о вычислениях с использованием шведского и английского языков. Я использую friendly_id для создания SEO-дружественных URL-адресов.

В моей mysql-таблице есть столбцы "slug", "slug_se" и "slug_en". Я не уверен, нужно ли мне использовать столбец «slug», он идентичен столбцу «slug_en».

Проблема: при использовании «update_attributes» «slug_se» заменяется на «slug» (по умолчанию английский). Таким образом, значение в «slug» записывается в «slug_se».

Устранение неполадок: – я нашел эту проблему в Google и нашел только одну (без ответа) ветку форума на форуме Google (http://groups.google.com/group/friendly_id/browse_thread/thread/154f4a5024e23418), которая остался без ответа. - Я пытался найти альтернативу update_attributes, я мог пройти через mysql, но это действительно было бы некрасиво.

Вопросы: нужно ли вообще использовать столбец "slug"? - Есть ли альтернатива update_attributes, которая также не пытается обновить идентификатор? - Вы видите что-то неправильное в том, что я делаю, что вызывает проблему?

Код: Модель:

  extend FriendlyId
  friendly_id :name, :use => :slugged, :use => I18n

person Christoffer    schedule 20.09.2011    source источник


Ответы (2)


Я автор FriendlyId. Вам, вероятно, повезет, если вы зададите этот вопрос в выпусках Github для проекта, я просто случайно увидел это.

Модуль i18n все еще довольно новый, так что извините за нестабильность и спасибо за отзыв. :)

Отвечая на ваш вопрос о столбце slug, нет, у вас его вообще не должно быть: просто slug_en и slug_se. Это изменение было внесено 4 сентября:

https://github.com/norman/friendly_id/commit/54536464132ac8f72c96e8bda203c337f9d56aa0>

Поэтому попробуйте удалить этот столбец. Если ваши проблемы не устранены, не стесняйтесь публиковать отчет об ошибке на Github, и я рассмотрю его, как только смогу.

Тем временем я попытаюсь добавить тест, чтобы попытаться воспроизвести описанную вами проблему, и если я смогу ее воспроизвести, я обязательно ее исправлю.

person Norman Clarke    schedule 21.09.2011

Норман, спасибо. Я удалил столбец slug, но это не решило проблему. Похоже, что слаг по умолчанию перезаписывает slug_se в update_attributes.

Это из лога:

    Started POST "/vardag/procent/result" for 127.0.0.1 at 2011-09-22 07:36:02 +0200
  Processing by CalculationsController#result as HTML
  Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>"Xrq9Zf8jGl2X1G9WvqMpcN1EQw7C2lda561FN9E7ZdM=", "first_number"=>"1.0", "second_number"=>
"2.5", "operation"=>"from_a_to_b", "commit"=>"Beräkna", "calculation_type_id"=>"vardag", "id"=>"procent"}
  ←[1m←[36mCalculation Load (1.0ms)←[0m  ←[1mSELECT `calculations`.* FROM `calculations` WHERE (`calculations`.`slug_se` = 'procent') LIMIT
1←[0m
  ←[1m←[35mCalculationType Load (1.0ms)←[0m  SELECT `calculation_types`.* FROM `calculation_types` WHERE (`calculation_types`.`id` = 1) LIMI
T 1
  ←[1m←[36mCACHE (0.0ms)←[0m  ←[1mSELECT `calculations`.* FROM `calculations` WHERE (`calculations`.`slug_se` = 'procent') LIMIT 1←[0m
  ←[1m←[35mSQL (1.0ms)←[0m  BEGIN
  ←[1m←[36mCalculation Load (1.0ms)←[0m  ←[1mSELECT `calculations`.* FROM `calculations` WHERE (`slug_se` = 'percentage' OR `slug_se` LIKE '
percentage--%') AND (id <> 1) ORDER BY LENGTH(`slug_se`) DESC, `slug_se` DESC LIMIT 1←[0m
  ←[1m←[35mAREL (1.0ms)←[0m  UPDATE `calculations` SET `recently` = 'someone_realized,that,when,1.0,goes_to,2.5,result_percentage_a_to_b_inc
reased,150.0,%', `slug_se` = 'percentage', `updated_at` = '2011-09-22 05:36:03' WHERE (`calculations`.`id` = 1)

Посмотрите @36mCACHE, где он (правильно) использует slug_se = procent, а затем две строки вниз. @36mCalculation LOAD делает выбор, где slug_se = процент (процент равен slug_en).

Я напишу отчет об ошибке в Git!

Изменить: я сделал еще несколько отладок, которые могут помочь:

Я вызываю обновление с помощью этого метода в модели:

 def update_recently(calculation, new_recently_string)
    raise calculation.inspect           
    calculation.update_attributes(:recently => new_recently_string.join(","))
  end

Это повышение создает это:

#<Calculation id: 1, name: "Percentage", preimp: nil, url: nil, clicks: 71, clicks_week: 71, is_local: true, comment: nil, nofollow: true, updated: nil, calculation_type_id: 1, created_at: "2011-03-12 07:04:54", updated_at: "2011-09-22 05:53:25", last_checked: nil, calculation_status_id: 2, region_id: 1, source: nil, affiliate: false, examples: nil, recently: "someone_realized,that,when,1.0,goes_to,2.5,result_p...", is_special: false, slug_en: "percentage", slug_se: "procent">

параметры:

{"utf8"=>"✓",
 "_method"=>"put",
 "authenticity_token"=>"Xrq9Zf8jGl2X1G9WvqMpcN1EQw7C2lda561FN9E7ZdM=",
 "first_number"=>"1.0",
 "second_number"=>"2.5",
 "operation"=>"from_a_to_b",
 "commit"=>"Beräkna",
 "calculation_type_id"=>"vardag",
 "id"=>"procent"}

Я сделал расчет рейза.

person Christoffer    schedule 22.09.2011