2013-05-15 4 views
0

지금 생각하고있는 것은 ...레일 : 조건부 유효성 검사 및보기

도서 (항목)가 가득한 라이브러리가 있습니다. 각 책에는 많은 체크 아웃 (임베디드 문서)이 있습니다.

내가하고 싶은 생각은 체크 아웃시 임베디드 문서로 새로운 "체크 아웃"을하는 것입니다. 체크인 할 때 체크 아웃을 편집하고 "date_checked_out"필드를 추가하고 싶습니다 ...

문제는 내 현재 모델/컨트롤러가 체크인 또는 체크 아웃 할 때마다 새 항목을 만듭니다 ... 그래서 두 배입니다. 중복 ...

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 더 자세한 정보가 필요하십니까?

체크 아웃 컨트롤러 :

def new 
    @entry = Entry.find(params[:entry_id]) 
    @checkout = @entry.checkout.new 
    respond_to do |format| 
     format.html {render :layout => false} 
    end 
    end 

    def create 
    @entry = Entry.find(params[:entry_id]) 
    @entry.update_attributes(:checked_out => "Out") 
    @checkout = @entry.checkout.create!(params[:checkout]) 
    redirect_to "/", :notice => "Book Checked Out!" 
    end 

class Checkout 
    include Mongoid::Document 
    include Mongoid::Timestamps 
    include Mongoid::MultiParameterAttributes 

    field :checkout_date, :type => Time 
    field :checkout_date_due, :type => Time 
    field :book_in, :type => Time, :default => Time.now 
    field :book_out, :type => Time, :default => Time.now 

    embedded_in :entries, :inverse_of => :entries 
end 
+0

책 및 체크 아웃의 모델 및 컨트롤러 코드를 제공 할 수 있습니까? – eabraham

+0

@eabraham, 내 업데이트를 참조하십시오. 새로운 표준/작성 방법과 전형적인 모델 ... 아직 특별한 것은 없습니다. –

+0

Entry 및 Checkout 모델을 게시 할 수 있습니까? – Squadrons

답변

0

은 체크 아웃이 시작이 날짜를 중지 할 의미가 있습니다. 체크인시 체크 아웃해야합니까? 체크 아웃 컨트롤러에서 '작성'대신 '업데이트'로 변경할 수 있습니다 - 업데이트시 checked_in_at를 입력하십시오.

구체적으로 말하면 - 체크 아웃 컨트롤러에서 PUT을 수락 할 수 있기를 원합니다 - 이것은 일반적인 것일 수 있습니다 (여러 가지 방법으로 체크 아웃을 업데이트 할 수 있음). 또는 구체적으로 이것을 정리하는 경로를 만들 수 있습니다. : 그것은 순수한 REST를 유지 checkouts_controller

def checkin 
    @checkout = Checkout.find(params[:id] 
    @checkout.update_attribute(:checked_in_at, Time.now) 

    # handle issues, redirect, etc. 

end 
+0

도서에는 체크 아웃/체크 인을위한 별도의 조치가 필요합니다. 그들은 동시에 일어나서는 안됩니다. 따라서 책을 체크인하면 링크에 "결제"라고 표시되어 사용자가 '상태 => : 체크 아웃'이라는 책을 체크 아웃하고 날짜를 입력 할 수 있습니다. 그러면 링크가 '체크인'으로 바뀌며 그 시점에서 사용자는 여유롭게 책을 체크인 할 수 있지만 이전 체크 아웃 항목 만 업데이트하고 새 항목은 만들어서는 안됩니다. –

+0

다른 말로하면 ... 체크 인 조건에서 시작 - 체크 아웃 상태를 "아웃"으로 설정하고 && 새 체크 아웃을 만듭니다. 그것이 "Out"이면, 이전 항목을 작성하지 말고 업데이트하십시오. –

+0

나는 이것을 알아 냈다. 나는 단지 if 문을 내 견해에두고 양식을 적절한 방법 인'update' 또는'create'로 지시했다. 단순한. 나는 내가 혼란스럽고 지나치게 복잡해 졌다고 생각한다. –

0

에서

resources :checkouts do 
    put :checkin, :on => :member 
end 

, 당신의 체크 아웃 컨트롤러에 업데이트 작업을 추가합니다.

또한 입력 모델을 게시하십시오. 나는 당신의 코드에서 엔트리가 has_one 체크 아웃이고, 체크 아웃이 엔트리에 속한다고 가정한다.

뭔가 같은 :

* 편집은 영업 이익 또한 조건부

... original boilerplate code ommitted 
    def update 
    @entry = Entry.find(params[:entry_id]) 
    # if the book is checked out 
    if @entry.checked_out == "out" 
     # then update it 
     @entry.update_attributes(:checked_out => "whatever" # though I'd seriously consider changing checked out to a boolean - if it's either out or in, true or false makes sense. Ignore this advice if there are more than two states 
     @checkout = @entry.checkout 
     respond_to do |format| 
     if @checkout.update_attributes(:checked_out => "newValue") 
     ... 
     else 
     .. handle errors 
     end 
     end 
    else 
     #the book does not have the correct status 
     respond_to do |format| 
     format.html { redirect_to some_action_path, :notice => "Entry is not out, so we cannot update its status." } 
     format.json { render json: #entry.errors, status: :unprocessible_entry } 
     end 
    end 
    end 

를 확인하는 동안이 어떻게 작동하는지 당신이 좀 더 명시 적으로 코드를 만들고 싶어,보고 싶어 나타나기 때문에 , 당신은 swards 조언을 복용하고 같은 몇 가지 명명 된 종점 만들기를 고려해 볼 수도 있습니다

나는 그 말이 맞는 것 같아요. hat 코드를 읽는 다른 사람이 작성 및 업데이트하는 것과는 대조적으로 해당 컨트롤러 작업이 수행하는 작업을 정확히 쉽게 알 수 있습니다.

+0

이것은 맞습니다 ...하지만 내 질문의 핵심은 어떻게 처리합니까? 책의 상태가 "Out"인 경우에만 업데이트하면됩니다 ... 코드가 나에게 Google을 신속하게 표시 할 수없는 내용이 표시되지 않습니다. :/ie. 컨트롤러 또는 뷰에서 조건을 갖는 것이 더 좋습니까? (저는 컨트롤러를 가정합니다. 전형적인 좋은 습관입니다.) 또한 이러한 조건으로 유효성 검사를 처리하려면 어떻게해야합니까? –

+0

나는 당신이 여기서 묻고있는 것이 긍정적이지는 않지만 두 가지 모두에서 그 조건부 논리를 가져야한다. 컨트롤러의 끝에서 조건에 따라 사용자가 의도적으로 또는 실수로 뷰를 우회 (URL에 대해 말리거나 숨겨진 js 버튼을 표시)하더라도 응용 프로그램은 모델 중 하나를 변경하는 작업을 수행하기 전에 계속 확인합니다. – Squadrons