2016-10-22 2 views
1

인스턴스 변수를 저장 한 다음 해당 인스턴스 변수의 값을 증가 시키려고했지만 재로드 할 때 항상 재설정됩니다.인스턴스 변수를 데이터베이스에 저장 Rails

<p id="waiting_counter"> 
     <% @waiting.increment %> 
     <%= @waiting.number_waiting %> 
     <% @waiting.save! %> 
    </p> 

그것을 2에서 항상 및 절대 변경 몇 가지 이유를 들어이

class Waiting < ApplicationRecord 
def increment 
    self.number_waiting += 1 
    save! 
end 
def decrement 
    self.number_waiting -= 1 
    save! 
end 
def reset 
    self.number_waiting = 0 
    save! 
end 
end 

컨트롤러이

class IndexController < ApplicationController 
def index 
    @waiting ||= Waiting.new(number_waiting: 0) 
    @waiting.increment 
    @waiting.save! 
end 
end 

HTML을 보이는처럼

모델은 다음과 같습니다 보인다. 몇 시간 동안이 간단한 문제에 대한 해결책을 찾던 중 도움을주십시오.

+0

이 코드가 해결해야하는 문제점에 대한 설명을 제공 할 수 있습니까? "사용자가 클릭하면 ... 그러면 그들은 볼 것입니다 ... 그리고 나서 ..." – max

+0

예를 들어 자동 대기 시스템과 같은 것입니까? – max

답변

0

연습 코드와 항상 2

난 당신이 (아마 indexes_path를 통해) IndexController#index로 이동한다고 가정하는 이유는 명백해야한다. 이렇게하면 0으로 초기화 된 완전히 새로운 Waiting 객체가 만들어지며 다음 줄에 1 씩 증가합니다. 그런 다음 저장하고 있습니다.

(html이 index.html.erb에서 온다고 가정하면) 레일스는 @waiting 개체가 다시 증가되는 동안 html을 렌더링 한 다음 2 인 값을 표시합니다. 그런 다음 해당 개체가 다시 저장됩니다.

정확하게 작동해야하지만 실제 문제는 레일 작동 방식에 대한 오해가있을 수 있다고 생각합니다. 컨트롤러에서 index 액션을 호출 할 때 (기본적으로) 해당 액션을 호출 한 결과 index.html.erb 페이지가 렌더링되고 임베디드 루비가 평가되는 시간입니다. 이것은 모두 서버 측에서 발생하고 결과 html이 클라이언트로 다시 전송됩니다. 증분 트리거를 시작할 클라이언트 측이 없습니다.

여기에서 실제로 달성하려는 내용과 증가가 어떤 방식으로 호출되는지는 분명하지 않습니다.

귀하의 질문을 검토 한 결과 인스턴스 변수가 초기화 된 후 모든 요청에 ​​사용 가능할 것으로 예상됩니다. 그렇다고 각 요청에 컨트롤러의 새로운 인스턴스가 생기므로 페이지를 다시로드 할 때마다 @instance는 처음에는 nil이되어 새로운 Waiting 객체가 생성됩니다. 당신이 대신해야 할 것은 당신이 일반적으로 인덱스 작업을 통해 기존 개체의 목록을 표시 할 규칙에 따라 : 다음 사항을 증가 다음 데이터베이스에서 대기 오브젝트를 잡고 덧붙여

def index 
    @waiting = Waiting.first 
    @waiting ||= Waiting.new(number_waiting: 0) 
    @waiting.increment 
    @waiting.save! 
end 

예컨대입니다.

+0

오랫동안 회신 해 주셔서 대단히 감사합니다. 내 문제를 해결했습니다. :) –

+0

다행 내가 도와 줄 수 있다면 :) 당신이 해결책을 받아 들일 수 있다면 이것이 당신의 질문을 해결할 것입니다 :) – David

관련 문제