【问题标题】:Invalid route name: 'users/:columnname_index' - Can't rollback, change column name, nor display some pages无效的路由名称:'users/:columnname_index' - 无法回滚、更改列名,也无法显示某些页面
【发布时间】:2013-09-19 01:19:08
【问题描述】:

我创建了一个迁移以将 Urlname 列添加到用户表。然后我为迁移添加了一个索引。这是生成的迁移:

class AddUrlnameToUsers < ActiveRecord::Migration
  def change
    add_column :users, :urlname, :string
    add_index :users, :urlname, :unique => true
  end
end

然后我使用了 rake db:migrate。

schema.rb 包含“urlname”列并表示它具有唯一索引。但是,我网站上的某些页面有错误:无效的路由名称:'users/:urlname_index'。

好吧,我不想称它为“urlname”。我想称之为“永久链接”。但现在我无法生成 FixColumnName 迁移、RemoveUrlNameFromUsers,也无法回滚 - 这三个都出现相同的“无效路由名称:'users/:urlname_index'”错误。

所以我从迁移文件中删除了add_index :users, :urlname, :unique =&gt; true,即使我已经迁移了它。那没有帮助。

我的 routes.rb 包含

Crowdpublishtv::Application.routes.draw do
  devise_for :users
  resources :users

  #resources 'users/:urlname', :to => 'User#booklist'
  #match 'users/:urlname_index', :to => 'users#show'

  devise_for :users
  authenticated :user do
    root :to => "users#booklist"
  end

  get "attachments/show"

  resources :users do
    resources :books
  end

  devise_for :users
  resources :users do
    member do
      get 'booklist', 'blog', 'profileinfo', 'readerprofileinfo', 'orgprofileinfo'
    end
  end
 end

我尝试注释掉和取消注释带有 # 标记的行。没有帮助。

这是相关的 db:migrate 状态:

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20130319002105  Create users
   up     20130328235904  ********** NO FILE **********
   up     20130703205730  Add devise to users
   up     20130911002912  Add bookfiles to users
   up     20130917143106  Add urlname to users

*NO FILE* 是我认为我已经回滚的东西......但是因为它早于“向用户添加 urlname”,所以我很漂亮确定这无关紧要。

关于什么是不正确的任何见解?我在 rails 3.1.0,ruby 1.9.2,使用 sqlite3,如果这很重要的话。

【问题讨论】:

    标签: ruby-on-rails ruby indexing routes migration


    【解决方案1】:

    您在 routes.rb 中有很多 devise_for :users。确保你只有一个,而且它的顺序很重要

    确保将资源 :users 放在 devise_for :users 路由下方。

    这里解释https://github.com/plataformatec/devise/wiki/How-To:-Manage-users-through-a-CRUD-interface

    【讨论】:

    • routes.rb 中的大部分 devise_for 代码都是在我安装 Devise gem 时自动生成的。在过去的两个月里,该代码一直在 routes.rb 文件中,没有问题。是 Urlname 给我带来了问题。
    • 我收回了。重要的是 devise_for 代码。不知道为什么突然就出问题了。谢谢!
    【解决方案2】:

    您的错误提示“路由名称无效”,因此您应该查看您的路由,而不是数据库索引。

    正如 vigneshre 所指出的,您的路线中有多个 devise_for。设计不会生成所有这些,我的猜测是你多次运行设计生成器(如果他们是这样到达那里的)。

    删除你不使用的路由并压缩你使用的路由。

    您的问题并不完全清楚,很难说出是什么触发了您的错误。您似乎同时询问了许多不同的问题。

    1. 如果迁移文件已经运行,则更改迁移文件不起作用。迁移文件只是针对您的数据库运行然后单独放置的脚本。您的 schema_migrations 表记录了运行的内容。文件运行后,您可以执行脚本的“向下”版本来回滚更改,但更改文件以删除一行对您的系统没有影响。

    2. 清理路线。路由指南可以帮助你更好的理解http://guides.rubyonrails.org/routing.html

    这有帮助吗?

    【讨论】:

    • 看起来清理设备允许回滚工作。我不知道为什么会出现这个问题,而且我自己也不会发现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-12
    • 2016-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-08-03
    • 2014-11-05
    • 2015-09-16
    相关资源
    最近更新 更多