Rails 3 验证和非 REST URL

Posted

技术标签:

【中文标题】Rails 3 验证和非 REST URL【英文标题】:Rails 3 validations and non REST URLs 【发布时间】:2011-07-27 08:18:28 【问题描述】:

我有这样的路线设置:

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

在我的主题控制器中,我使用

@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"

【问题讨论】:

不清楚应用程序应该做什么。这是否像一个 tinyurl 克隆,除了它应该在被未知的 :url 命中时创建一个新主题?您的主题记录是在哪里创建的? 人们将为他们的主题创建一个登陆页面,他们将能够选择他们的一个网址,例如domain.com/mysubject 主题通常在 domain.com/subjects/new (创建操作)中创建,并在主题保存后重定向到 domain.com/mysubjecturl。 domain.com/X 转到主题/节目。如果主题不存在 url X 然后它重定向到 Rails.root。 听起来像 subject_controller#create 正在重定向,就好像它成功了,即使失败了。发布它可能会有所帮助。 【参考方案1】:

我认为你的路线文件没问题。

通常 ActiveRecord 回滚选择表中已有重复条目,例如多个空条目或空白条目。 如果您在填充表后设置唯一性验证并且没有在迁移文件中设置索引,则可能就是问题所在。

在这种情况下,你可以这样做:

在迁移文件中插入索引:

class CreateSubjects < ActiveRecord::Migration
  def change
    ...
  end
  add_index :subjects, :url, :unique => true
end
重做迁移并为表设置种子。

如果这不起作用,请发送您的迁移文件和 active_record 模型。

【讨论】:

以上是关于Rails 3 验证和非 REST URL的主要内容,如果未能解决你的问题,请参考以下文章

Rails:验证链接(URL)的好方法是啥?

带有rails 3应用程序的ios json身份验证

Rails:通过表单创建新记录时验证后的 URL 失败

使用 JWT 联合身份的 REST 身份验证/授权

验证REST API的URL资源

用于身份验证的 REST API URL 的最佳实践