0

チェックボックスがオンになっているかどうかに応じて、Task リソースのブール属性を変更したいと考えています。何をすべきかわからないので行き詰まっています...このAJAXチェックボックスを追加する前にすべてが機能し、CRUD全体があり、すべてがrspecとカピバラでテストされ、ブートストラップされています。私は次のコードを持っています...

ビュー/タスク/show.html.erb

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

この :completed は、タスクのブール属性です。

javascripts/tasks.js.coffee

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

この $.post() を完了する方法と、コントローラーでコードを機能させる方法がわかりません...これまでのところ、これしかありません...

controllers/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

また、もっと欲しい人のために... このことのテストを書く方法は? そして、私はこれのためにそれらをまったく書くべきですか?

編集: 調査の結果、人々はこのようにやっていることがわかりました.これは行くべき道ですか? 要素を調べると、チェックボックスを変更すると新しいリクエストが行われていることがわかりますが、ブール値はまだfalseのままです...

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

3 に答える 3

3

これは非常に多くの点でエレガントなソリューションではありませんが、機能します:)

show.html.erb

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

タスク.コーヒー

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
于 2012-05-19T17:58:14.340 に答える
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') 関数によって達成されます)。

Firebug または Chrome/Opera/Safari インスペクターを使用して ajax リクエストを検査しました。完全なイベントへの関数のように、$.post 関数にさらに機能を追加できます。ajax と $.post 関数に関する jQuery ドキュメントを参照してください。

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

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

于 2012-05-18T17:37:37.353 に答える
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 を指定して data パラメーターを含める必要もあります。

于 2012-05-18T19:42:00.147 に答える