我有一个任务管理器的计时器功能,它具有播放/暂停/重置/停止/完成,影响任务的某些属性,例如started_at
,paused_at
,resumed_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
端
答案 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。