2016-08-02 41 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將爲您定義。讓我知道引發錯誤的實際字段名稱和代碼。將錯誤粘貼到問題中。 –