Ruby on rails RubyonRails:使用;完成“控制器任务”;对于RESTful Rails

Ruby on rails RubyonRails:使用;完成“控制器任务”;对于RESTful Rails,ruby-on-rails,ruby,rest,routes,Ruby On Rails,Ruby,Rest,Routes,我很难以平静的方式完成任务。我有一个“任务”控制器,还有一个“完成任务”控制器 我在complete_tasks_controller创建操作中有以下内容: def create @task = Task.find(params[:id]) @task.completed_at = Time.now @task.save end 我试着称之为: <%=link_to "Complete task", new_task_complete_task_path(@task),

我很难以平静的方式完成任务。我有一个“任务”控制器,还有一个“完成任务”控制器

我在complete_tasks_controller创建操作中有以下内容:

def create
   @task = Task.find(params[:id])
   @task.completed_at = Time.now
   @task.save
end
我试着称之为:

<%=link_to "Complete task", new_task_complete_task_path(@task), :method => :post %>
:post%>
…但我在提到“只允许get、put和delete请求”时出错了


你知道我做错了什么吗?

每个map.resources语句routes.rb都会创建一个通用的RESTful路由,用于指定的资源。REST的吸引力在于它使用请求类型和url来确定要采取的操作。在与HTTP相关的四个动词中,每一个都有特定的用法

POST => Create
GET => Retrieve
PUT => Update
DELETE => Destroy
您得到关于只允许get、put和delete请求的错误的原因是您使用的是post请求。实际上,您告诉Rails您想要创建一个id为1的任务。但是,无法创建已存在的项。这就是为什么不允许发布帖子。相反,您希望使用put,因为您正在更新现有记录

你可以通过改变帖子来做到这一点,把你的电话链接放进去。
:put%>


通读和,它将帮助您理解HTTP请求之间的区别,并提供一些关于Rails如何处理这些请求的见解。

每个map.resources语句routes.rb创建一个通用的RESTful路由,用于指定的资源。REST的吸引力在于它使用请求类型和url来确定要采取的操作。在与HTTP相关的四个动词中,每一个都有特定的用法

POST => Create
GET => Retrieve
PUT => Update
DELETE => Destroy
您得到关于只允许get、put和delete请求的错误的原因是您使用的是post请求。实际上,您告诉Rails您想要创建一个id为1的任务。但是,无法创建已存在的项。这就是为什么不允许发布帖子。相反,您希望使用put,因为您正在更新现有记录

你可以通过改变帖子来做到这一点,把你的电话链接放进去。
:put%>


通读和,它将帮助您了解HTTP请求之间的区别,并提供一些关于Rails如何处理这些请求的见解。

将其移动到控制器中名为complete的操作中会更有意义:

def complete
  @task = Task.find(params[:id])
  @task.complete!
end
要使用RESTful路由访问此操作,您需要在config/routes.rb中定义如下的新成员路由:

:member=>{:complete=>:put}
添加到任何预先存在的
map.resources:tasks
的末尾也会起作用,您应该只有一行
map.resources:tasks
行,除非它是嵌套的。医生比我解释得更好

要从视图中访问它,请执行以下操作:

link_to "Complete this task", complete_task_path(@task), :method => :put
方法
完成将在您的模型中定义,如下所示:

def complete!
  self.completed_at = Time.now
  save!
end

这样做的原因是,它将模型逻辑放在它所属的位置:在模型中。

将其移动到控制器中名为“完成”的操作中会更有意义:

def complete
  @task = Task.find(params[:id])
  @task.complete!
end
要使用RESTful路由访问此操作,您需要在config/routes.rb中定义如下的新成员路由:

:member=>{:complete=>:put}
添加到任何预先存在的
map.resources:tasks
的末尾也会起作用,您应该只有一行
map.resources:tasks
行,除非它是嵌套的。医生比我解释得更好

要从视图中访问它,请执行以下操作:

link_to "Complete this task", complete_task_path(@task), :method => :put
方法
完成将在您的模型中定义,如下所示:

def complete!
  self.completed_at = Time.now
  save!
end

这样做的原因是,它将模型逻辑放在它所属的位置:在模型中。

太棒了!非常感谢EmFi(和雷达)!工作完美:)伙计,这太错了。我并不是说您使用Rails是错误的,只是Rails尝试使用REST的方式是错误的。执行PUT不应允许以这种方式进行部分更新。PUT是资源的完全替换。客户机在PUT主体中发送的内容应该是资源的完整内容。GPPD确实与CRUD不匹配,而且有这么多的参考文献说GPPD与CRUD不匹配,这真是太遗憾了。Darrel,我仍在努力解决这个问题:那么哪个动词对于部分更新是正确的呢?或者部分更新在RESTful应用程序中被认为是一个坏主意?@Mike PATCH-在这成为一个公认的标准之前,唯一的其他选择是发布到处理端点,或者通过正式的更改请求对不同的资源执行PUT。这是一种不幸的情况,但如果无法避免部分更新,我们需要忍受这种情况。PUT表示部分更新。更新操作使用它,并且只能编辑资源的一部分。请不要去炫耀还没有在Rails中的东西,因为这会让那些新手感到困惑。太棒了!非常感谢EmFi(和雷达)!工作完美:)伙计,这太错了。我并不是说您使用Rails是错误的,只是Rails尝试使用REST的方式是错误的。执行PUT不应允许以这种方式进行部分更新。PUT是资源的完全替换。客户机在PUT主体中发送的内容应该是资源的完整内容。GPPD确实与CRUD不匹配,而且有这么多的参考文献说GPPD与CRUD不匹配,这真是太遗憾了。Darrel,我仍在努力解决这个问题:那么哪个动词对于部分更新是正确的呢?或者部分更新在RESTful应用程序中被认为是一个坏主意?@Mike PATCH-在这成为一个公认的标准之前,唯一的其他选择是发布到处理端点,或者通过正式的更改请求对不同的资源执行PUT。这是一种不幸的情况,但如果无法避免部分更新,我们需要忍受这种情况。PUT表示部分更新。更新操作使用它,并且只能编辑资源的一部分。请不要去佛罗里达州