路由错误。渲染使用get而不是put ...为什么?

时间:2012-10-11 12:03:28

标签: ruby-on-rails ruby ruby-on-rails-3 rest routing

我有以下代码:

任务/ _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'

控制器/ tasks_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

任务/ create.js.erb

$('#incomplete-tasks').append("<%= j render partial: 'task', locals: {task: @task} %>");

任务/ _task.html.haml

%li
    = task.description
    = link_to "Done", activity_task_path(task.activity, task: task), html_options = {method: :put, class: 'pull-right'}

我遇到的问题是当它尝试使用js渲染部分我的restful资源activity_task_path时,会发送一个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]

您可以在https://trackit.mlpinit.com在线查找该应用,以便更好地了解我的目标。 您可以使用随机电子邮件地址进行身份验证,我将确认设置为2.days。

[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>}

再次,如果我不通过ajax调用这样做,它可以正常工作。我的假设是问题发生是因为它出于某种原因不理解put方法......

[EDIT5]

如果我从_task部分获取链接,则附加发生没有任何错误。我想我应该提一下

[EDIT6]

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

我有一个任务表:

task form

我输入任务名称

enter image description here

我点击(输入)以创建它。

我收到以下错误:

enter image description here enter image description here

如果我点击刷新,则生成的任务正常:

enter image description here

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

3 个答案:

答案 0 :(得分:1)

查看rake routes | grep task

  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>

17?task=5部分搞砸了,应该是:/activities/17/tasks/5

<强> [编辑]

更改链接:

= link_to "Done", activity_task_path(:activity_id => task.activity_id, :id => task.id), html_options = {method: :put, class: 'pull-right'}

路由错误显示在:activity_id下面有一个对象而不是id,而:task属性是不必要的,应该:id有一个任务ID值。

答案 1 :(得分:1)

activity_task_path(task.activity, task: task)

activity_task_path需要两个id参数,我认为你的上一个现在混合了task:task和post参数。你也会因为form_for而得到混合,并尝试使用'update'来执行任务。您没有提供任何数据字段。

所以我认为你的解决方案是:

activity_task_path(task.activity, task)

答案 2 :(得分:0)

您确定要加载Rails不显眼的javascript驱动程序, rails.js?我会确保您的 Gemfile 中包含以下行:

gem 'jquery-rails', '~> 2.1'

如果您使用的是Rails 3.1,则将其包含在 application.js 中:

//= require jquery
//= require jquery_ujs

如果您需要有关安装的更详细说明,请结帐this