Ruby on rails 路由错误。使用get而不是put进行渲染。。。为什么?

Ruby on rails 路由错误。使用get而不是put进行渲染。。。为什么?,ruby-on-rails,ruby,ruby-on-rails-3,rest,routing,Ruby On Rails,Ruby,Ruby On Rails 3,Rest,Routing,我有以下代码: tasks/_-form.html.haml %h3 Tasks %span.form-inline.centered = form_for [@activity, @task], remote: true do |f| = f.text_field :description, {placeholder: 'Enter task description and click + to create a new task', class: 'inpu

我有以下代码:

tasks/_-form.html.haml

%h3 
    Tasks
%span.form-inline.centered
    = form_for [@activity, @task], remote: true do |f|
        = f.text_field :description, {placeholder: 'Enter task description and click + to create a new task', class: 'input-task'}
        = f.submit "+", class: 'btn btn-danger'
%li
    = task.description
    = link_to "Done", activity_task_path(task.activity, task: task), html_options = {method: :put, class: 'pull-right'}
控制器/任务\u controller.rb

  def create
    activity = Activity.find(params[:activity_id])

    flash[:error] = I18n.t "errors.task.generic" if !activity.add_task!(params[:task])    

    @task = activity.tasks.last

    respond_to do |format|
      format.html { redirect_to activity_path(activity) }
      format.js
    end
  end
$('#incomplete-tasks').append("<%= j render partial: 'task', locals: {task: @task} %>");
任务/create.js.erb

  def create
    activity = Activity.find(params[:activity_id])

    flash[:error] = I18n.t "errors.task.generic" if !activity.add_task!(params[:task])    

    @task = activity.tasks.last

    respond_to do |format|
      format.html { redirect_to activity_path(activity) }
      format.js
    end
  end
$('#incomplete-tasks').append("<%= j render partial: 'task', locals: {task: @task} %>");
我遇到的问题是,当它试图使用js呈现部分内容时,我的restful资源
活动\u任务\u路径
发送一个get方法,而不是我指定的put方法。如果我不使用js渲染它,而只是刷新浏览器,它就可以正常工作。我现在得到一个路由错误,因为我没有显示页面。不过我不需要。我只需要它通过put方法更新我的任务。如果有人能解释为什么会发生这种情况,我将不胜感激

[EDIT1]

如果您有任何问题或需要我添加任何代码或任何其他我可以做的事情来帮助让我知道。我真的不明白为什么会这样。多谢各位

[EDIT2]

  def update
    activity = Activity.find(params[:id])
    activity.update_task!(params[:task])
    redirect_to activity_path(params[:id])
  end
这是我的更新控制器

[EDIT3]

你可以在网上找到该应用程序,以便更好地了解我正在尝试做什么。 您可以使用随机电子邮件地址进行身份验证,我已将确认设置为2.5天

[EDIT4]

跳起来让它更清楚。。。下面是通过ajax添加新任务时出现的错误

路由错误

没有路线匹配

 {:action=>"show", :controller=>"tasks", :task=>#<Task id: 64, description: "lalala", complete: false, created_at: "2012-10-11 19:41:22", updated_at: "2012-10-11 19:41:22", activity_id: 6>, :activity_id=>#<Activity id: 6, title: "Lala", description: "this is lala", created_at: "2012-10-10 18:37:18", updated_at: "2012-10-10 18:37:18", user_id: 2, activity_group_id: nil>}
{:action=>“show”、:controller=>“tasks”、:task=>#、:activity#u id=>#
再一次,如果我不通过ajax调用来实现这一点,那么它可以正常工作。我的假设是,问题的发生是因为它不理解put方法的某些原因

[EDIT5]

如果我从我的_任务部分获取链接,则追加不会发生任何错误。我想我应该提一下

[EDIT6]

我将添加一个视觉演练,以确保我能理解自己

我有一个任务表:

我输入一个任务名称

我点击(回车)加号来创建它

我得到的错误如下所示:

如果我点击刷新,则生成任务确定:


这就是为什么我认为它必须在.js.erb文件中的原因…

您是否确保正在加载Rails不引人注目的javascript驱动程序,Rails.js?我将确保以下行在您的文件中:

gem 'jquery-rails', '~> 2.1'
//= require jquery
//= require jquery_ujs
如果您使用的是Rails 3.1,请将其包含在application.js中:

gem 'jquery-rails', '~> 2.1'
//= require jquery
//= require jquery_ujs

如果需要更详细的安装说明,请签出。

查看
rake routes | grep任务

  activity_task GET    /activities/:activity_id/tasks/:id(.:format)      tasks#show
                PUT    /activities/:activity_id/tasks/:id(.:format)      tasks#update
然后检查浏览器中出现问题的生成链接,检查它是否对应于
update
路由,以及它是否具有
data method=“put”
属性

好的,我已经登录并检查了,生成的链接不好:

<a href="/activities/17/tasks/17?task=5" class="pull-right" data-method="put" rel="nofollow">Done</a>
路由错误显示:activity_id下有一个对象而不是唯一的id,并且
:task
属性是不必要的,应该有
:id
和任务id值

activity_task_path(task.activity, task: task)
activity_task_path需要两个id参数,我认为您的最后一个id参数现在与任务混合在一起:task和post参数。您也会因为表单_而产生混淆,并尝试使用此方法对任务使用“更新”。您没有提供任何数据字段

因此,我认为您的解决方案是:

activity_task_path(task.activity, task)

创建操作不应该是
:post
?您的模板是
create.js.erb
,但控制器不清楚,我假设创建操作,但可能是
update
?另外,如果您添加
rake routes | grep task
的输出,则会更加清晰,这样我们就知道正确的路由已经就位。还有一件事,如果我们讨论的是创建操作,那么路径应该是
activity\u tasks\path(task.activity)
。@CasualCoder我更新了我的控制器。这是创建操作。不过,创建操作是正确的。生成的链接应允许更新的链接。但事实并非如此。我还在那里添加了我的更新控制器。我需要活动和活动任务来更新任务完成属性in
update
您有
activity.find(params[:id])
但是在
create
中有
activity.find(params[:activity\u id])
。那么它不应该是
Activity.find(params[:Activity\u id])
中的
update
?活动和任务都是嵌套资源,对吗?@casualcode是的,你是对的,这对我来说没有多大意义。让我更改它,如果有任何更改,我会跟进。gem'jquery rails',2.1.3'gem'jquery ui rails',2.0.2'这两个都存在。。。另外//=require jquery//=require jquery\u ujs这些是存在的
activity\u task GET/activities/:activity\u id/tasks/:id(:format)tasks#show
PUT/activities/:activity\u id/tasks/:id(:format)tasks#update
它们显示在那里。生成的链接是好的。但是如果我使用remote,它实际上不会附加最后一个任务…“如果我使用remote”,你的意思是这样的
=link\u to“Done”,activity\u task\u path(task.activity,task:task),html\u options={method::put,remote:true,class:'pull right'}
?所以您可以像在
create
action中那样就地更新它?因此,请执行与那里相同的操作,使update.js.erb模板使用您的更新操作呈现它,并在那里添加js以将任务添加到适当的位置(隐藏、显示等)而不是那里。。。创建任务时,我的远程设备位于tasks/_form.html.haml中。正在创建任务。如果我点击刷新,它会显示在页面上。但是它没有被显示。。。我相信是因为这个错误…好的,所以它在
”失败,您是否检查过它是否会将链接附加到“#”路径?因此,确保这是生成错误的路径?如果我获取该链接,它将毫无问题地附加。。。我不知道它为什么会产生这个错误。即使我会生成一个断开的链接,它也会继续