2014-01-21 2 views
0

거기에 관련 질문이 많다는 것을 알고 있지만, 제 일을 할 수는 없습니다. 다음은 내가 가지고있는 것입니다 ...Rails, Ajax 및 boolean; 확인란을 선택 취소 할 수 없습니다

#app/views/tasks/index.html.erb 
<%- @tasks.each do |task| %> 
    <div class="task-wrapper"> 
    <%= check_box_tag 'checked_in', task.id , task.checked_in, :class => "task-check" %> 
    <%= content_tag :span, task.name %> 
    </div> 
<% end %> 
<%= link_to 'New Task', new_task_path %> 

    <script> 
$(".task-check").bind('change', function(){ 
    if (this.checked){ 
    $.ajax({ 
     url: '/tasks/'+this.value+'/toggle', 
     type: 'POST', 
     data: {"checked_in": this.checked} 
    }); 
    } 
    else { 
    alert("no"); 
    } 
}); 
    </script> 

#app/controllers/tasks_controller.rb 
... 
def toggle 
    @task = Task.find(params[:id]) 

    if @task.update_attributes(:checked_in => params[:checked_in]) 
    # do I need something here? 
    else 
    # do I need something here? 
    end 
end 
... 

내 작업 모델에는 'checked_in'속성이 있으며 부울입니다. 나는이 질문에서이 코드를 가지고

...

Rails change boolean value with checkbox and jquery ajax

... 그리고 꽤 벌어지고있는 모든 것을 이해하지 않습니다. 새 작업을 만들 때 부울 값을 true로 설정하는 상자를 성공적으로 선택할 수 있습니다. 그러나 상자를 선택 취소하면 "아니오"라고 표시되는 js 팝업이 표시되지만 DB에는 아무 것도 설정되지 않으며 서버에 다시 전송되지 않습니다.

아이디어가 있으십니까?

답변

2

어떻게 브라우저가 작동하는지. 그들은 체크되지 않은 체크 박스의 가치를 보내지 않습니다.

매개 변수의 유무에 따라 선택/선택 취소 여부를 결정해야합니다.

4

문제는 함수가 this.checked을 테스트

$(".task-check").bind('change', function(){ 
    if (this.checked){ 
    $.ajax({ 
     url: '/tasks/'+this.value+'/toggle', 
     type: 'POST', 
     data: {"checked_in": this.checked} 
    }); 
    } 
    else { 
    alert("no"); 
    } 
}); 

당신은/체크 상자를 선택 해제

에서, change 이벤트가 트리거됩니다 당신의 JS 코드에서 온다. 상자가 선택되어 있지 않은 경우 false false을 반환하므로 alert을 호출하는 else에 직접 들어가야합니다.

따라서 조건을 제거하고 싶을 것입니다.

1

감사합니다. Antoine. 그게 효과적 이었어. 나는 JS를 배울 수있는 최선을 다했다. 여기 후세를 위해 추가로 내가 지금 여기에 콘솔에서 발생되는 템플릿 오류가 발생했다 ...

응용 프로그램/뷰/작업/index.html.erb ... 일 것

<%- @tasks.each do |task| %> 
    <div class="task-wrapper"> 
    <%= check_box_tag 'checked_in', task.id , task.checked_in, :class => "task-check" %> 
    <%= content_tag :span, task.name %> 
    </div> 
<% end %> 
<%= link_to 'New Task', new_task_path %> 

    <script> 
$(".task-check").bind('change', function(){ 
    $.ajax({ 
     url: '/tasks/'+this.value+'/toggle', 
     type: 'POST', 
     data: {"checked_in": this.checked} 
    }); 
}); 
    </script> 

입니다 업데이트 된 컨트롤러 코드.

def toggle 
    @task = Task.find(params[:id]) 
    @task.update_attributes(:checked_in => params[:checked_in]) 
    render :nothing => true 
    end 
+0

안녕하세요. 또한 다음 질문에 대해, (좋은) 해결책을 제공하려면 다른 게시물을 작성하는 대신 질문을 편집해야합니다. 게시물은 답변을 위해 예약되어 있으며 주문은 시간이 지나면 변경 될 수 있습니다. – Antoine

관련 문제