2010-06-13 7 views
0

내 데이터베이스에 "저장된"이라는 부울 필드가 있습니다. 상황에 따라 "저장"에서 "저장 취소"로 변경되는 텍스트 링크를 클릭하여이 필드를 전환하고 "고객"테이블을 0 또는 1로 업데이트합니다. Javascript가이를 수행 할 수있는 방법이 될 수 있습니다. Javascript에서 코드를 작성하는 방법을 알기에는 아직 충분히 경험하지 못했습니다 (아직!).레일 : 뷰에서 부울 필드를 전환하는 방법?

질문을 짧게 유지하기 위해 질문을 롤백했습니다. 여기 정확한 코드가 있습니다.

#employers controller 
def save_toggle 
    @matching = Matching.find(params[:id]) 
    if @matching.employer_stars == false 
    @matching.employer_rejects = false # If saving a match, remove any existing rejection. 
    end 
    @matching.employer_stars = [email protected]_stars 
    @matching.save 
    render :partial => "save_unsave_buttons", :layout => false 
end 

#view home.html.erb 
<%= render :partial => "save_unsave_buttons", :locals => {:matching => matching} %> 

#partial _save_unsave_buttons.html.erb 
<div id="save_buttons" class="buttonText"> #latter is just for CSS layout 
    <% if @matching.employer_stars %> 
    <%= link_to_remote "Unsave", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% else %> 
    <%= link_to_remote "Save", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% end %> 
</div> 

데이터베이스가 작동하지만 토글 텍스트가 전환되지 않습니다. @nathanvda : 정말 고통스럽게해서 유감입니다. 답을 확인하고 싶습니다.하지만 잠시 동안이 질문을 남기고 다시 돌아와서 좌절감을 느낍니다. 고마워.

답변

1

saved 속성을 설정하는 컨트롤러 메소드를 정의해야합니다. 보기에서 link_to_remote을 사용하여이 방법에 연결할 수 있습니다.

시작해야합니다.

--update : 후 업데이트 질문 :

당신은 렌더링이 부분을 작성해야 당신이 같은/unsave 저장 버튼을, "_save_unsave_buttons.html.erb"호출 :

<div id="save_buttons"> 
    <% if matching.employer_stars %> 
    <%= link_to_remote "Unsave", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% else %> 
    <%= link_to_remote "Save", 
     :url => {:action => "save_toggle", :id => matching.id}, 
     :update => {:success => "save_buttons", :failure => "Error"} %> 
    <% end %> 
</div> 

이 부분을 올바른 저장 단추를 표시하고 업데이트시 포함 된 div는 컨트롤러 조치의 결과로 업데이트/대체됩니다. 메인 뷰 내부에서

, 당신은 버튼을 표시 할

<%= render :partial => "save_unsave_buttons", :locals => {:matching => match } %> 

물품.

그리고 컨트롤러 내부

:

def save_toggle 
    @matching = Matching.find(params[:id]) 
    @matching.employer_stars = [email protected]_stars 
    @matching.save 
    render :partial => "save_unsave_buttons", :locals => {:matching => @matching}, :layout => false 
end 

행운을 빕니다!

- 다시 업데이트 : @ 일치 항목 집합을 렌더링한다고 가정하면 더 많은 혼동과 우발적 인 오타를 방지하기 위해 컬렉션과 항목 사이의 이름을 바꿀 것입니다.

그러나 실제로이 꽤 간단하다

@matchings.each do |match| 
    .. build your view here .. 
    <%= render :partial => "save_unsave_buttons", :locals => {:matching => match} 
end 

당신의 부분에

당신은 모든 곳에서 올바른 matching를 사용할 수 있습니다.

+0

안녕하세요 @nathanvda, 의견 주셔서 감사합니다. 위의 질문을 업데이트했습니다. – sscirrus

+0

안녕하세요 @ 스카프 : 그에 따라 내 대답을 업데이 트했습니다. 나는 그것이 지금 더 분명하기를 바란다? – nathanvda

+0

안녕하세요 @ nathanvda : 거의 다 왔습니다. 지나 가기 위해 단지 최종적인 에러 - 나는 그것을 추가 할 필요가 있었다 : '일치하는'것을 인식 할 수 있도록 부분을 호출하는 현지인. 그러나 토글이 작동하지 않습니다. 자세한 내용은 내 업데이트를 참조하십시오. 지금까지 1 개 이상을 주셨고 고맙습니다. – sscirrus

1

그냥주의 :

귀하의 save_toggle 방법은 편안하고 없습니다. HTTP PUT 동사는 idempotent (o.a. http://en.wikipedia.org/wiki/Idempotence#Examples 참조)로 구현되어야합니다. 즉, 실행 빈도에 관계없이 항상 동일한 작업을 수행해야합니다. 위의 예에서 save_toggle 메서드를 한 번 실행하면 두 번 실행하는 것과 같은 결과를 얻지 못합니다.

더 좋은 방법은 :,

def set_employer_stars 
end 

def unset_employer_stars 
end 

을 예컨대을 두 가지 방법을 만들 수 또는 당신이 그들을 전화를 원하는 것입니다.그런 다음 link_to_remote 메소드에서이 두 가지 방법을 사용할 수도 있습니다 (이제 "저장하지 않음"과 "저장"둘 다에서 save_toggle을 사용하기 때문입니다).

+0

귀하의 의견을 반깁니다 Van der Hoorn. 내가 그걸 가져갈거야. – sscirrus

관련 문제