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的主要内容,如果未能解决你的问题,请参考以下文章