2016-08-02 2 views
0

부울 열이 published 인 모델 항목이 있습니다. 기본값은 false입니다. 나는 다음과 같은 방법을 추가 내 models/entry.rb에서모델 부울 메서드가 제대로 작동하지 않습니다.

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 

: 다음은 전체 마이그레이션 파일의 내가 만들 때, 그러나

<% @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 %> 

:

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

index.html.erb에 나는이있어 항목을 내 색인보기로 이동하면 항목이 게시 된 것으로 표시됩니다.

+1

'self.published?'메소드가 항상 true를 반환합니다. –

+0

나는 그것을 얻었고 나의 질문을 편집했다. 나는'self.published '대신에 실수를했다.''published?' '방법이있다. 어떻게 다시 쓸 수 있니? – AlexNikolaev94

+0

여전히 true를 반환합니다. 이 모델에 대한 메소드가 필요하지 않습니다. 아래의 답변이 옳습니다. –

답변

1

괜찮 으면 모든 부울 속성에 대해 레일스는 기본적으로 도우미 메서드를 제공합니다. 정의 할 필요가 없습니다. 따라서 귀하의 경우 entry.published?은 귀하가 직접 작성한 방법 없이도 사용할 수 있습니다. 자신의 메소드 정의를 제거하면 필요하지 않습니다.

그냥 한 가지 더 말하면 인스턴스 메소드가 아니라 클래스 메소드를 정의했습니다. 작성한 메서드와 마찬가지로 Entry.published?과 같이 호출 할 수 있지만 Entry 인스턴스는 호출 할 수 없습니다. 그러나이 경우 entry.published?publish이 부울 필드이므로 레일스가 상자에서 정의했기 때문에 작동합니다. 이제 클래스의 메소드 구현을 다음과 같이 수정해야합니다.

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

불행히도, 귀하의 제안 중 어느 것도 효과가 없습니다 :( 첫 번째 오류는' 'self.published? '대신에'published?'메소드를 사용했습니다. (제 질문 편집) 메소드를 완전히 제거하고 변형을 시도했습니다.'NoMethodError'를 반환했습니다. – AlexNikolaev94

+0

@ AlexNikolaev94 작동해야합니다. 필요합니다. 아마도 올바른 메서드 이름을 제공합니다. 시도한 코드를 추가하면 오류가 발생합니다. 모델에 추가 한 실제 필드. –

+0

@ AlexNikolaev94'self.published? '는 절대로 사용하지 않을 것이고,이 경우 클래스 메소드를 만들 것이다. 그러나 Rails 인스턴스 메소드는 당신을 위해 정의 할 것이다. 오류를 던지는 실제 필드 이름과 코드를 알려주십시오. 질문에 오류를 붙여 넣으십시오. –

관련 문제