Rails:将属性值设置为nil

时间:2014-07-02 17:55:27

标签: ruby-on-rails ruby

我有一个任务管理器的计时器功能,它具有播放/暂停/重置/停止/完成,影响任务的某些属性,例如started_atpaused_atresumed_at,和done。我已经成功地设置了播放/暂停/重置/完成,但我希望停止使started_at值恢复为零。这是我无法使语法正常运行的部分。

这是我的Reset& amp;按钮。完成:

<%= link_to raw("<i class=\"glyphicon glyphicon-refresh\"></i> Reset"), task_path(task, "task[started_at]" => DateTime.now), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>
<%= link_to raw("<i class=\"glyphicon glyphicon-ok\"></i> Complete"), task_path(task, "task[done]" => true), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>

这是我在停止尝试的失败:

<%= link_to raw("<i class=\"glyphicon glyphicon-refresh\"></i> Reset"), task_path(task, "task[started_at]" => nil), :method => :put, :confirm => "Sure?", class: "btn btn-default btn-sm" %>

我想首先设置值NIL的原因是我使用nil条件来判断是否暂停/恢复,因为这意味着它已经或者之前没有启动过。我看到的所有其他SO问题/答案是如何首先解决nil值或在模型级别设置默认值。我感谢任何帮助!

编辑(2014年3月7日):这是我的错误消息 -

ActionController :: TasksMissing在TasksController#update中 param丢失或值为空:task

提取的来源(第99行): 97 98 99 100 101

# Never trust parameters from the scary internet, only allow the white list through.
def task_params
  params.require(:task).permit(:id, :description, :done, :priority, :started_at, :time_limit, :assignee, :creator, :accepted, :project_id, :paused_at, :resumed_at, :time_spent, :due, :duedate, :duetime, :repeat, :importance)
end

2 个答案:

答案 0 :(得分:1)

为什么不在控制器中写一个新动作来重置时间戳?

<强> task_controller.rb

def stop
  @task.started_at = nil
  @task.save!

  # Do something
end

<强>的routes.rb

resources :tasks do
  member do
    put :stop
  end
end

然后将您的观点更改为:

<%= link_to 'somthing', stop_task_path(task), :method => :put

修改

我会试着解释你为什么会这样做 ActionController::ParameterMissing in TasksController#update param is missing or the value is empty: task

当你这样做时:

<%= link_to "something", task_path(task, "task[started_at]" => nil), method: put

将url帮助器实际忽略将task[started_at]的值设置为 nil

如果你仔细查看生成的链接,它应该是/tasks/xx,如你所见,这个网址中没有任务参数。

正如 @ Stratus3D 在评论中所述,您也可以尝试使用''代替 nil 。因此,执行以下操作将起作用

<%= link_to "something", task_path(task, "task[started_at]" => ''), method: put

生成的网址为/tasks/x?task%5Bstarted_at%5D=(其中%5B %5D 分别为[]网址编码)

答案 1 :(得分:1)

进一步了解您要实现的目标,您可能希望在您的任务模型中引入status,并为您提供一个执行complete逻辑的方法:

class Task < ActiveRecord::Base
  def complete
    self.status = 'completed'
    self.started_at = nil
    self
  end
end

注意:在这种情况下,您可能不想再将started_at设置为nil

这种方式来自您的控制器,您可以拥有以下端点:

class TasksController < ApplicationController

  def complete
    @task = Task.find(params[:id])
    @task.complete.save

    respond_with @task
  end

end

路线看起来像这样:

resource :tasks do
  put :complete, on: :member
end

最后,如果您发现自己使用任务的状态做了更复杂的事情,您可能需要查看state_machine gem