如何在Rails 4中update_attributes值

时间:2013-09-10 12:44:13

标签: jquery ruby-on-rails ajax

我是ROR的新手,目前在Rails4上工作。我在访问attr_accessible和update_attributes时遇到问题。如果选中该复选框,我想将布尔值更新为true。 这是我的代码

controller.rb

class TasksController < ApplicationController

before_action :signed_in_user, only: [:edit, :new, :show, :destroy, :index]

def new
    @task =current_user.tasks.new
end

def create
    @task= current_user.tasks.new(params[:task].permit(:name, :taskname ))

    if @task.save
      redirect_to @task
     else
     render 'new'
    end
end

def show
    user = Task.find(params[:id]).user.id
    if user == current_user.id
       @task =current_user.tasks.find(params[:id])
    else
     flash[:notice] = "Access Denied "
      redirect_to tasks_path
    end
   end

  def index

@task=current_user.tasks.all
  end

def edit
 user = Task.find(params[:id]).user.id
 if user == current_user.id
  @task =current_user.tasks.find(params[:id])
 else
  flash[:notice] = "Access Denied "
   redirect_to tasks_path
 end
end
def update
  @task = current_user.tasks.find(params[:id])

   if @task.update(params[:task].permit(:name,:taskname))
  redirect_to @task
  else
  render 'edit'
  end
end

def destroy
 @task = current_user.tasks.find(params[:id])
 @task.destroy

 redirect_to tasks_path
end

def done
 @task = current_user.tasks.find(params[:id])
 if @task.done
  @task.update_attributes(completed: false)
 else 
  @task.update_attributes(completed: true)
 end    
end

private

def signed_in_user
  redirect_to new_user_registration_path, notice: "Please sign in." unless signed_in?
 end
end

我在Tasks#index

中收到NoMethodError错误

索引中的复选框代码如下:

index.html.erb

  <h1>Listing tasks</h1>
   <div id="new">
    <%= link_to 'Add new task', new_task_path, class: "btn btn-primary" %>
   </div><p>
  <table class="PersonList">
    <tr>
       <th>TaskName</th>
        <th>PersonName</th>

    </tr>

     <% @task.each do |task| %>
     <tr>
       <td class="checklist_check" ><%= check_box_tag "complete_task", task.id, task.done,  :class => 'complete_task'   %> <%= task.taskname%></td>
        <td> <%= task.name %> </td>

   <td><%= link_to 'Show', task_path(task) %></td>
   <td><%= link_to 'Edit', edit_task_path(task) %></td>
   <td><%= link_to 'Destroy', task_path(task), method: :delete, data: { confirm: 'Are you sure?' } %></td>
  </tr>
  <% end %>

我的js文件是:

tasks.js

$(function(){
$(".complete_task").live("change", function(task_id) {
    $.ajax({
        url: "/tasks/done",
        data: "id="+task_id, 
        success: function() { alert('completed') }
    });
  });
});

除了提到在控制器中完成的方法之外,获得NoMethod错误的原因是什么。

我也正确地给了我的路线。

我主要关心的是如何在Rails4和update_attributes中使用强参数,以便boolean将表单true更改为false,反之亦然。

谢谢!

2 个答案:

答案 0 :(得分:0)

你必须像这样使用它

@task.update_attribute :completed, false

答案 1 :(得分:0)

应该是

  def done
    @task = current_user.tasks.find(params[:id])
    @task.update_attributes(completed: true)
  end

或者

 def done
    @task = current_user.tasks.find(params[:id])
    @task.update_attribute(:completed, true)

 end

您的复选框应该像

 <% if task.completed == true %> 
 <%= check_box_tag "complete_task", task.id, true, :class => 'complete_task'   %>
 <% else %>
 <%= check_box_tag "complete_task", task.id, true, :class => 'not_complete_task'   %>
 <% end %> 




$(function(){
 $(".complete_task").live("change", function(task_id) {
   $.ajax({
    url: "/tasks/done",
    data: "id="+task_id, 
    success: function() {$(this).css({}); } #style for strike out
    });
  });
 });