Rails 3,自定义操作和HTML请求方法

时间:2010-10-06 00:41:23

标签: ruby-on-rails ruby http routing

我真的不了解使用“post”vs“get”vs“put”请求,自定义控制器操作以及是否使用链接或表单/按钮的专业人士和骗局。

所以,假设我有一个简单的待办事项列表,包含任务和任务控制器,我想要一个“完整”的操作,我在数据库中找到一个特定的任务,并将其状态属性从“不完整”更新为“完成“。

def complete
  @task = Task.find(params[:id])
  if @task.update_attributes(:status => "complete")
    redirect_to tasks_url, :notice => "Completed!"
  else 
    redirect_to tasks_url, :error => "Whoops."
  end
end

定义此路由的最佳做法是什么,我应该使用哪种HTML请求方法(post?put?get?),我应该使用普通链接还是表单? (并注意:假设我的用户安全模型都是用设计计算出来的,并且在过滤器之前是适当的等等)

最重要的是,我如何在Rails 3 routes.rb文件中清楚地表达所有这些?

请注意,以下代码并不适用于我:

#routes.rb
resources :tasks do
   members do
     post 'complete'
   end
end

所以目前我正在使用它:

#routes.rb
match 'tasks/:id/complete', 'tasks#complete', :as => "complete_task"

#view
= link_to "Complete", complete_task_path(:id => @task.id)

但这会触发get请求,我觉得它应该是“put”或“post”。或者它应该是一个链接?它应该是一个隐藏字段的表单吗?

1 个答案:

答案 0 :(得分:2)

“link_to”方法通常会生成一个锚标记,即“< a>< / a>”,即常规GET请求

使用link_to执行POST请求,您应该执行以下操作

= link_to "Complete", complete_task_path(:id => @task.id), :method => :post

请记住,如果在浏览器中禁用了javascript,则上述语句将回退到GET请求而不是POST。