我很难解决以RESTful方式完成任务的问题.我有一个"任务"控制器,还有一个"complete_tasks"控制器.
我在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 %>
..但是我在提到"只允许获取,放置和删除请求"时遇到错误.
你知道我做错了什么吗?
将它移动到控制器中名为complete的动作会更有意义:
def complete @task = Task.find(params[:id]) @task.complete! end
要使用RESTful路由访问此操作,您需要在config/routes.rb中定义这样的新成员路由:
map.resources :tasks, :member => { :complete => :put }
添加:member => { :complete => :put }
到任何预先存在的结尾map.resources :tasks
也可以做到这一点,你应该只有map.resources :tasks
一行,除非它是嵌套的.该路由指南解释了这个比我以往任何时候都能够更好地.
从视图中获取它:
link_to "Complete this task", complete_task_path(@task), :method => :put
complete!
然后在您的模型中定义该方法,如下所示:
def complete! self.completed_at = Time.now save! end
这样做的原因是它将模型逻辑放在它所属的位置:在模型中.