Rails ID给出404

时间:2013-08-21 16:31:30

标签: ruby-on-rails ruby routing rails-postgresql

在我的rails App中,我有一个Movies表和一个Genres表。类型需要具有特定的:id,以便电影和流派之间的关联可以正常工作。我无法改变流派的身份。

前段时间我在rails控制台中创建了所有类型

g = Genre.new
g.name = "Action"
g.id = 23
g.save!

g = Genre.new 
g.name = "Comedy"
g.id = 1034
g.save!

这保存并创建了类型并使用给定的id,所以如果我去了/ genres / 23 它会把我带到动作类型。

在发布之前,我重置了整个数据库并重新创建了类型。

但如果我现在正在运行

g = Genre.new 
g.name = "Comedy"
g.id = 1034
g.save!

当我尝试去/ genres / 1034时出现404错误,但是如果我进入流派/索引页面,Comedy仍然被列出。

如果我在没有指定id的情况下创建一个类型,我不会收到错误。

我已经重置了Genre表,我使用了this gem但我仍然得到了404.就像PostgreSQL只记得id 103423一样,如果我尝试再次使用它们,它给出了404

任何人都有解决方案吗?如何使用以前使用和销毁的ID创建类型

Genre.rb

class Genre < ActiveRecord::Base
  attr_accessible :name

has_many :movies
end

类型#show

def show
@genre = Genre.find(params[:id])
end

1 个答案:

答案 0 :(得分:1)

我认为Postgres正在为该类型选择自己的id并进行设置。这就是你得到404错误的原因。您指定的ID不存在。

如果你像这样搜索类型,你会得到什么:

@genre = Genre.find_by_name("Comedy")
@genre.id

尝试覆盖Postgres的id确定方法时,您将遇到一致的问题。您是否无法更改Movies表中的值?为什么你不能只改变电影记录的genre_id以匹配Postgres为该记录确定的类型ID?

替代修复

我相信,如果你真的需要,你可以这样做:

Genre.update_all("id = 1034", "name = 'Comedy'")

update_all语句会将名称等于Comedy的所有记录的ID更改为1034,而不会在手动设置ID时遇到Rails / Postgres限制。