2016-08-02 43 views
0

我有一个模型条目,布尔列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

您的'self.published?'方法一直返回true。 –

+0

我明白了,我编辑了我的问题 - 我犯了一个错误,而不是'self.published?''我刚刚发布了''方法。我怎么能重写它? – AlexNikolaev94

+0

它仍然一直返回'true'。在这个模型中不需要一个方法,下面的答案是正确的。 –

回答

1

好的,对于任何布尔属性,rails默认给你一个辅助方法。你不需要定义它。所以,在你的情况下,entry.published?将无需你自己的书面方法。删除你自己的方法定义它不是必需的。

只是FYI还有一件事,你定义了一个类方法,而不是一个实例方法。就像您写的方法一样,可以调用Entry.published?,但不能调用Entry的实例。但在这种情况下,entry.published?将工作,因为Rails为您定义了开箱即用,因为publish是一个布尔字段。现在,您必须修复方法的类实现:

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

不幸的是,你的建议都没有工作:( 对于第一个 - 这是我的错误,发表了?'方法而不是'self.published?'(编辑我的问题) 我试图彻底删除这个方法,并尝试了你的变体 - 它给我返回一个'NoMethodError'。 – AlexNikolaev94

+0

@ AlexNikolaev94它必须工作,你需要给出可能正确的方法名称,添加你试过的代码,你得到了错误是您添加到模型中的实际字段。 –

+0

@ AlexNikolaev94你永远不会使用'self.published?',这将创建类方法,这不是你想要的。但实例方法Rails将为您定义。让我知道引发错误的实际字段名称和代码。将错误粘贴到问题中。 –