2017-04-03 21 views
1

私はSinatraアプリケーションを作成しようとしています。Sinatra scope nomethoderror

しかし、私は解決できないバグがあります。だから私は助けが必要です。

私は/タスクに入った?状態=行われ、アプリケーションのアラート

NoMethodErrorタスク/で未定義のメソッド `status_is_done」

どのように私はバグを修正することができますか?可能であれば、何かヒントを教えてください。

ここにモデルコードがあります。ここで

module Todo 
class Task < ActiveRecord::Base 
scope :status_is, ->(status){where(status: status)} 

scope :status_is_not_yet, ->{status_is(NOT_YET)} 
scope :status_is_done, ->{status_is(DONE)} 
scope :status_is_pending, ->{status_is(PENDING)} 

NOT_YET = 0 
DONE = 1 
PENDING = 2 

STATUS = { 
    'NOT_YET' => NOT_YET, 
    'DONE' => DONE, 
    'PENDING' => PENDING 
}.freeze 

validates :name, presence: true, length: {maximum: 140} 
validates :content, presence: true 
validates :status, numericality: true, inclusion: {in: STATUS.values} 


def status_name 
    STATUS.key(self.status) 
end 

エンド エンド

とは、コントローラー・コードです。

require 'sinatra/base' 
require 'haml' 


require 'todo/db' 
require 'todo/task' 

module Todo 
class Application < Sinatra::Base 

set :haml, escape_html: true 

configure do 
    DB.prepare 
end 

configure :development do 
    require 'sinatra/reloader' 
    register Sinatra::Reloader 
end 

get '/' do 
    redirect :tasks 
end 

get '/tasks' do 
    @tasks = Task.order('created_at DESC') 
    #statusによって@statusの値を変更 
    if (@status = params[:status]) 
    case @status 
    when 'not_yet' 
     @tasks = @tasks.status_is_not_yet 
    when 'done' 
     @tasks = @tasks.status_is_done 
    when 'pending' 
     @tasks = @tasks.status_is_pending 
    else 
     @status = nil 
    end 
    end 

    haml :index 
end 

end 
end 

答えて

0

@tasks = Task.order('created_at DESC').status_is_done 
+0

ああどのように素敵で

@tasks = @tasks.status_is_done 

を交換してみてください。私はバグを修正することができました。なぜ私にバグがあったのですか? –

+0

これで問題は解決しましたか?スコープは、オブジェクトではなくモデルに対して呼び出されるはずです。 – Sajin

+0

私は理解しました。私を助けてくれてありがとう!! –