【问题标题】:Rails 3.0: No route error on PUT member routeRails 3.0:PUT 成员路线上没有路线错误
【发布时间】:2011-11-28 05:19:24
【问题描述】:

我有一个 Rails 3.0 应用程序,它具有一个简单的投票机制,可以为反对票的数量添加计数。我在 routes.rb 中设置了一个 PUT 路由,并在我的控制器中创建了一个方法来处理它。否决票链接本身可以正确呈现,但单击它会给我一个路由错误 No route matches "/venues/18/down_vote" 错误。

这是我的控制器代码:

def down_vote
  @venue = Venue.find(params[:id])

  respond_to do |format|
    if @venue.update_attribute(:mon_closed_accuracy_downvotes => @venue.mon_closed_accuracy_downvotes + 1)
      format.html { redirect_to(:back, :flash => { :success => "Shenanigans were successfully called on #{ @venue.name }'s closing time." }) }
      format.xml  { head :ok }
    else
      format.html { render :action => 'show' }
      format.xml  { render :xml => @venue.errors, :status => :unprocessable_entity }
    end
  end
end

这是我的 down_vote 路线的路线代码:

resources :venues do 
  put 'down_vote', :on => :member
end

查看代码(在部分场地列表中):

<%= link_to 'Incorrect?', down_vote_venue_path(venue), :method => :put %>

同样,视图本身渲染良好,链接按预期渲染:

<a href="/venues/15/down_vote" data-method="put" rel="nofollow">Incorrect?</a>

有什么想法吗?

【问题讨论】:

  • 你是对的。我误读了 API。可能将问题与其他问题混为一谈。很抱歉 :) 你能在应用日志中确认服务器确实收到了 PUT 请求吗?
  • 不用担心。 :) 现在我正在查看日志,看来它实际上出于某种原因在执行 GET 请求:Started GET "/venues/18/down_vote" for 127.0.0.1 at 2011-11-28 01:01:41 - 0500。奇怪的是,由于 data-method 属性按预期形成,因此它会执行 put 请求。
  • 我仍然会切换到使用按钮,因为链接应该指向GET 资源,并且可以右键单击并在新选项卡/窗口中打开。
  • 好点;我切换到它一个按钮,所以现在它是: down_vote_venue_path(venue), :method => :put %> 现在页面不会呈现,我明白了: 没有路线匹配 {:action=>"/venues/17/down_vote", :method=>:put, :controller=>"venues"}
  • 看起来我的原始代码现在可以工作了,唯一的变化是它不是在控制器中调用update_attribute,而是在场地模型中调用一个方法,这会增加模型实例中的否决票并打一个普通的save! 电话。

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


【解决方案1】:

听起来您的 javascript 有问题。您是否包含正确的文件?你的布局是什么样的?

【讨论】:

  • 除了我添加的 Mapstraction 和 Google Maps API 之外,这是 Rails 包含在布局中的内容:
  • 看起来我的 jQuery 版本是 1.5,并且在您的投票示例中不包含 jquery_ujs.js 文件:github.com/BM5k/vote_sample/tree/master/public/javascripts,它使用 1.7。我安装的 jquery-rails gem 似乎在 rails.js 中放了一堆东西来处理它。我会尝试更新 gem...
  • 我使用了 jquery-rails 1.0.18 它更改了 =javascript_include_tag :defaults 包含的脚本列表,以便 jquery、jquery-ui(如果使用)和 jquery-ujs 脚本都加载为顺便说一句,所有这些在 rails 3.1 中都容易得多,其中 jQuery 是默认设置。
  • Hrmm... 为 gem 版本指定 1.0.18 并运行 Bundler 更新似乎没有添加 ujs 或更改项目中的任何 js 文件。我想我可以尝试复制 vote_sample 中的 js 文件,因为至少安装了 gem 的正确版本。如果做不到这一点,可能会勇敢地升级到 Rails 3.1。
  • 看起来运行rails g jquery install 帮助升级了 jQuery 并安装了 ujs 文件。我还必须更改 config/application.rb 以将 :defaults 符号指向大于零:# config.action_view.javascript_expansions[:defaults] = %w(jquery rails)。删除了手动 jquery 脚本标签并使用 &lt;%= javascript_include_tag :defaults %&gt; 使其全部同步。留下这些步骤以防将来有人访问此页面。现在解决我原来的问题...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多