0

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

控制器.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文件是:

任务.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 中使用强大的参数来立即将布尔值从 true 更改为 false,反之亦然。

谢谢!!

4

2 回答 2

0

你必须像这样使用它

@task.update_attribute :completed, false
于 2013-09-10T12:46:21.907 回答
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
    });
  });
 });
于 2013-09-10T12:49:29.043 回答