Rails 4.2 Sequel Model - Form_for on new not not working as expected

时间:2016-01-28 16:34:11

标签: ruby-on-rails ruby sequel sequel-gem

我创建了一个新的Rails 4.2项目,根据文档设置了Sequel Gem并运行以下命令来设置我项目的第一部分:

rails generate scaffold Author nom_de_plume:string real_name:string email_address:string code_of_conduct_date:datetime created_at:datetime updated_at:datetime --orm=sequel

rake db:migrate

基于对Stackoverflow和一些Google链接的阅读,我的模型框架看起来像:

class Author < Sequel::Model
  # ---
  extend ActiveModel::Naming
  include ActiveModel::Conversion
  def persisted?
    true
  end
  # ---
  plugin :validation_helpers
  plugin :after_initialize
  # ---
  def validate
    super
    validates_presence [:nom_de_plume, :real_name, :email_address, :code_of_conduct_date]
    validates_unique([:nom_de_plume, :email_address])      end # def validate
  # ---
  def after_initialize
    super
  end # def after_initialize
end # class Author < Sequel::Model

控制器尚未库存/未经修改。当我去http://localhost:3000/authors/时,一切都按预期工作。

然而,当我点击http://localhost:3000/authors/new&#34;新作者&#34;链接,我收到以下错误:

Showing /project/app/views/authors/_form.html.erb where line #1 raised:

No route matches {:action=>"show", :controller=>"authors", :id=>nil} missing required keys: [:id]

Extracted source (around line #1):
1 <%= form_for(@author) do |f| %>
2
3 <% if @author.errors.any? %>
4 <div id="error_explanation">
5 <h2><%= pluralize(@author.errors.count, "error") %> prohibited this author from being saved:</h2>
6

显然这是破碎的行为; &#34;显示&#34;不应该在&#34;新&#34;请求。

我创建了一个新项目,使用sequel-rails gem&amp;关联配置(使用默认的ActiveRecord),完全相同的代码按预期工作,没有错误。

我花了几个小时做搜索,却找不到解决方法。我已经擦除了项目并重新启动,并且可以重现所描述的一致行为。

我知道我可以放下 sequel-gem 然后回到AR,但我真的不愿意这样做。

我很欣赏能够解决这个问题的正确方向。提前谢谢。

2 个答案:

答案 0 :(得分:1)

如果您使用Sequel with Rails的表单助手,您应该使用active_model Sequel插件(Sequel附带)。在加载模型类之前,您可以使用Sequel::Model.plugin :active_model来执行此操作。如果您之后仍有问题,请发布更多详情。请注意,问题似乎是Rails问题,而不是续集问题,因为失败是在生成正确的路径。

答案 1 :(得分:0)

在这里添加一些ActiveModel子模块,完整列表:

class Author < Sequel::Model

  extend ActiveModel::Naming
  include ActiveModel::Conversion
  include ActiveModel::Model
  include ActiveModel::AttributeMethods
  include ActiveModel::Dirty
  include ActiveModel::Serialization

  def persisted?
    true
  end

  # ...

end