2012-05-18 21 views
0

Я хочу изменить логический атрибут моего ресурса задачи в зависимости от того, установлен ли флажок checkbox. Я застрял, поскольку не знаю, что делать ... У меня есть все, прежде чем добавлять этот флажок в AJAX, весь CRUD, все проверено с помощью rspec и capybara и загружено. У меня есть следующий код ...Изменить атрибут с помощью флажка, AJAX, jQuery

просмотров/задачи/show.html.erb

27  <%= form_for [@project, @task], :remote => true do |f| %> 
28  <%= f.label :completed %>  
29  <%= f.check_box :completed %> 
30  <% end %> 

Это: завершено это логический атрибут задачи.

JavaScripts/tasks.js.coffee

8 jQuery -> 
    9 $('#task_completed').bind 'change', (event) => 
10  $.post() 

не знаю, как закончить это $ .post() вещь и как сделать код в работе контроллера ... До сих пор я только это ...

контроллеры/tasks_controller.rb

1 class TasksController < ApplicationController 
    2 
    3 before_filter :authenticate_user! 
    4 before_filter :find_project_from_project_id 
    5 before_filter :find_task, :only => [:show, :edit, :update] 
    6 
    7 def show 
    8  @title = @task.name 
    9 end 
10 
11 def new 
12  @title = 'New task' 
13  @task = @project.tasks.build 
14 end 
15 
16 def create 
17  @task = @project.tasks.build(params[:task]) 
18  if @task.save 
19  current_user.tasks.push(@task) 
20  redirect_to [@project, @task], :notice => 'Task created' 
21  else 
22  render 'new' 
23  flash.now[:alert] = 'Task not created' 
24  end 
25 end 
26  
27 def edit 
28  @title = 'Edit task' 
29 end 
30 
31 def update 
32  if @task.update_attributes(params[:task]) 
33  redirect_to [@project, @task], :notice => 'Task updated' 
34  else 
35  render 'edit' 
36  flash.now[:alert] = 'Task not updated' 
37  end 
38 end 
39 
40 private 
41 #controller doesn't respond to these methods as actions 
42 
43 def find_project_from_project_id 
44  @project = current_user.projects.find(params[:project_id]) 
45  rescue ActiveRecord::RecordNotFound 
46  redirect_to projects_path 
47  flash[:alert] = 'Project you were looking for could not be found' 
48 end 
49 
50 def find_task 
51  @task = @project.tasks.find(params[:id]) 
52  rescue ActiveRecord::RecordNotFound 
53  redirect_to project_path(@project) 
54  flash[:alert] = 'Task you were looking for could not be found' 
55 end 
56 
57 end 

Кроме того, для те, кто хочет больше ... Как написать тесты для этой вещи? И должен ли я писать их вообще для этого?

EDIT: После исследования я обнаружил, что люди делают это так ... Это путь? При осмотре элемента можно увидеть новые запросы делаются, когда я изменить флажок, но логическое по-прежнему остается ложным ...

8 jQuery -> 
    9 $('#task_completed').bind 'change', (event) => 
10  $('#task_completed').parents('form:first').submit() 
11  $('.task_headline').toggleClass('completed_task') 

ответ

2

Вы не предоставляют атрибуты к действию $ .POST.

Попробуйте сделать что-то вроде этого:

$('#task_completed').bind('change', function() { 
    var url = $(this).closest('form').attr('action'); 
    var data = {}; 
    data.task = {}; 
    data.task.completed = $(this).is(':checked'); 
    $.post({ 
     url: url, 
     data: data 
    }); 
}); 

Это сделает функциональность вам, как вы мне объяснили по IRC комнате. Поскольку значения флажков передаются только в том случае, если флажок установлен, мы должны установить произвольное логическое значение, если флажок установлен или нет (достигается функцией $ (this) .is (': checked')).

Проверен запрос ajax с использованием Firebug или инспектора Chrome/Opera/Safari. Вы можете добавить больше функций в функцию $ .post, как функцию для всего события. Посмотрите в документации JQuery о AJAX и функции $ .post:

http://api.jquery.com/jQuery.ajax/

http://api.jquery.com/jQuery.post/

+0

благодарит за помощь. однако он возвращает это> Неверный запрос bad URI '/ projects/1/tasks/[object% 20Object] '. WEBrick/1.3.1 (Ruby/1.9.3/2012-02-16) на ноутбуке: 3000 – oFca

+0

, поэтому я предполагаю, что мне нужно передать идентификатор задач? если да, то как это сделать? – oFca

0

Поскольку это действие Ajax, вы должны справиться с этим по-разному в контроллере, чем обычно ,

def update 
    if @task.update_attributes(params[:task]) 
    @notice = 'Task updated' 
    else 
    @notice = 'Task not updated' 
    end 
end 

И в свете update.js.erb, что-то вроде:

$(#notice).html('<%= @notice %>') 

В Jquery .post(), вы действительно должны указать URL-адрес и включить параметр данных, как это было предложено ранее.

3

Это не элегантное решение, во многих отношениях, но это работает :)

show.html.erb

<script> 
window.monitorTaskCompletion(1,1) 
</script> 

tasks.coffee

window.monitorTaskCompletion = (project_id, task_id) -> 
    jQuery -> 
     $('#task_completed').bind 'change', (event) => 
     $.ajax 
      url: "/projects/#{project_id}/tasks/#{task_id}/complete" 
      data: {completed: if $('#task_completed').is(':checked') then 1 else 0} 
      type: "PUT" 

tasks_controller.rb

def complete 
    @completed = params[:completed].to_i > 0 
    @task.complete(@completed) 
    respond_to :js 
end 
Смежные вопросы