模型布尔方法无法正常工作

时间:2016-08-02 08:30:18

标签: ruby-on-rails

我有一个带有布尔列published的模型条目,默认设置为false。这是完整的迁移文件:

class CreateMultifloraEntries < ActiveRecord::Migration[5.0]
  def change
    create_table :multiflora_entries do |t|
      t.string :type, index: true
      t.string :title
      t.string :slug, unique: true
      t.json :payload
      t.integer :user_id, index: true
      t.boolean :published, default: false

      t.timestamps
    end
  end
end

在我的models/entry.rb中,我添加了以下方法:

def published?
  Entry.where("published", true)
end

并在index.html.erb我得到了这个:

<% @entries.each do |entry| %>
   # ...
   <% if entry.published? %>
     <p> Published <p>
   <% else %>
     <!-- There will be an AJAX request to set entry published later -->
     <%= link_to "Publish", "whatever-path" %>
   <% end %>
<% end %>

但是,当我创建一个条目并导航到我的索引视图时,该条目显示为已发布。

1 个答案:

答案 0 :(得分:1)

好的,对于任何布尔属性,rails默认为您提供辅助方法。你不需要定义它。因此,在您的情况下entry.published?将在没有您自己的书面方法的情况下工作。删除您自己的方法定义,不需要它。

仅仅是为了另外一件事,你定义了一个类方法,而不是一个实例方法。与您编写的方法一样,可以像Entry.published?一样调用,但不能在Entry的实例上调用。但在这种情况下entry.published?将起作用,因为Rails为您定义了它,因为publish是一个布尔字段。现在,您必须将方法的类实现修复为:

def self.published?
  self.where(published: true).any?
end