Rails 3 валидации и не REST URL - PullRequest
2 голосов
/ 01 апреля 2011

У меня есть такой маршрут:

match '/:url' => 'subjects#show'

В моем контроллере Subjects я использую

@subject = Subject.where("url = ?", params[:url].downcase).first 

вместо

@ subject = Subject.find (params [: id])

и это прекрасно работает. Проблема в том, что ни одна из моих работ по проверке для предметной модели.

validates :url, :uniqueness => true

Эта проверка выше не работает, и я получаю это, но только когда URL уже существует:

SQL (0.5ms)  BEGIN
  Subject Load (0.3ms)  SELECT `subjects`.`id` FROM `subjects` WHERE (`subjects`.`url` = BINARY '78') LIMIT 1
  SQL (0.2ms)  ROLLBACK
  SQL (0.2ms)  BEGIN
  CACHE (0.1ms)  SELECT `subjects`.`id` FROM `subjects` WHERE (`subjects`.`url` = BINARY '78') LIMIT 1
  SQL (0.1ms)  ROLLBACK

Меня перенаправляют на темы / шоу существующей записи, как будто все отлично. В противном случае, когда URL-адрес является уникальным, точно такой же SQL-запрос не откатывается и запись создается.

Есть идеи, как мне решить эту проблему? Это связано с моими пользовательскими предметными маршрутами? Я вырываю волосы. Вот остальные мои маршруты:

  match '/auth/:provider/callback' => 'authentications#create'
  match '/about' => 'pages#about'
  match '/dashboard' => 'subjects#index', :as => 'user_root'

  get "pages/home"
  get "pages/about"

  resources :authentications

  devise_for :admins
  devise_for :users, :controllers => {:registrations => 'registrations'} 

  resources :subjects do
    member do
      get 'stats'
      get 'comments'
      get 'qrcode'
      get 'download_qrcode'
    end
  end

  resources :traits
  resources :ratings
  resources :assets 

  match '/:url/stats' => 'subjects#stats'
  match '/:url/remove' => 'subjects#remove'
  match '/:url/comments' => 'subjects#comments'
  match '/:url/edit' => 'subjects#edit'
  match '/:url' => 'subjects#show'

  root :to => "pages#home"

1 Ответ

0 голосов
/ 25 сентября 2012

Я думаю, ваш файл маршрутов в порядке.

Обычно откат ActiveRecord выбирается, когда в вашей таблице уже есть дублированные записи, например, несколько пустых или пустых записей. Если вы задали проверку уникальности после заполнения таблицы и не указали индекс в своем файле миграции, возможно, это проблема.

В этом случае вы можете сделать:

  • Вставьте индекс в файл миграции:

    class CreateSubjects < ActiveRecord::Migration
      def change
        ...
      end
      add_index :subjects, :url, :unique => true
    end
    
  • Повторите миграцию и загрузите таблицу.

Если это не работает, отправьте файл миграции и модель active_record.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...