0

我有以下代码:

任务/_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 方法更新我的任务。如果有人能解释为什么会发生这种情况,我将不胜感激。

[编辑1]

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

[编辑2]

  def update
    activity = Activity.find(params[:id])
    activity.update_task!(params[:task])
    redirect_to activity_path(params[:id])
  end

这是我的更新控制器。

[编辑3]

您可以在https://trackit.mlpinit.com上在线找到该应用程序,以更好地了解我想要做什么。您可以使用我将确认设置为 2.days 的随机电子邮件地址进行身份验证。

[编辑4]

希望让它更清楚......这是我通过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 方法......

[编辑5]

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

[编辑6]

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

我有一个任务表:

任务表

我输入任务名称

在此处输入图像描述

我点击(输入)加号来创建它。

我收到上面也出现的以下错误:

在此处输入图像描述 在此处输入图像描述

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

在此处输入图像描述

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

4

3 回答 3

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值。

于 2012-10-11T13:38:20.133 回答
1
activity_task_path(task.activity, task: task)

activity_task_path 需要两个 id 参数,我认为你的最后一个现在与任务混合:任务和 post 参数。由于 form_for 并尝试使用此方法对任务使用“更新”,您也会得到混淆。您没有提供任何数据字段。

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

activity_task_path(task.activity, task)
于 2012-10-11T13:49:15.627 回答
0

您是否确保正在加载 Rails 不显眼的 JavaScript 驱动程序rails.js?我会确保以下行在您的Gemfile中:

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

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

//= require jquery
//= require jquery_ujs

如果您需要有关安装它的更详细说明,请查看此内容。

于 2012-10-11T13:06:01.807 回答