link_to只有在AJAX创建帖子后才能匹配路由

时间:2014-07-18 15:18:23

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

基本上每当我使用AJAX创建帖子时,由于这一行,它都不会呈现新帖子:

<%= link_to "promote", vote_scribble_path(:scribble_id => scribble.id, :vote => true), remote: true, method: :post%>

上面的链接实际工作,它只是阻止新创建的帖子的ajax渲染。

这是我在尝试使用AJAX创建新帖子时遇到的错误,它确实创建了帖子,它会在没有上面的行的情况下呈现新帖子。刷新页面后,将显示带有工作链接的新帖子。

  Rendered scribbles/_scribbles.html.erb (18.9ms)
  Rendered scribbles/create.js.erb (19.7ms)
Completed 500 Internal Server Error in 48ms

ActionController::RoutingError - No route matches {:action=>"vote", :controller=>"scribbles", :scribble_id=>155, :vote=>true}:

以下是完整的代码:

create.js.erb 在创建

后更新帖子列表
 /*Replace the html of the div post_lists with the updated new one*/
 $("#posts_list").html("<%= escape_javascript( render(:partial => "scribbles/scribbles") ) %>");

feedlist.html 会渲染所有帖子

        <div id="posts_list">
        <%=render :partial => 'scribbles/scribbles', :locals => {:scribbles => @scribbles}%>
        </div>

scribbles / _scribbles.html link_to单行阻止了ajax渲染。但它的确有效。

  <% @scribbles.each do |scribble| %>
<%= link_to "promote", vote_scribble_path(:scribble_id => scribble.id, :vote => true), remote: true, method: :post%>
  <%end%>

即使这样的事情也会给我一个错误

<%= link_to "promote", vote_scribble_path()%>

vote_scribble_path(:scribble_id => scribble.id, :vote => true), remote: true, method: :post, :put,:get %> tried them all still same error 

在AJAX CREATE之后,链接工作它不会出现,在页面刷新后一切都很好。 任何想法为什么?

  resources :scribbles do
        member do
      post 'vote'
    end
    end

scribble_controller.rb

def vote
  @scribble = Scribble.find(params[:scribble_id])
  @vote = params[:vote]
  if @vote == "true"
    @v = :up
    current_user.vote(@scribble, :direction => @v)
  else
    current_user.unvote_for(@scribble)
  end
    respond_to do |format|
      format.js{}
    end
end

1 个答案:

答案 0 :(得分:2)

您应该在id中传递scribble_id而不是link

<%= link_to "promote", vote_scribble_path(:id => scribble.id, :vote => true), remote: true, method: :post%> 

因为根据您定义的路线,生成的vote操作路线为:

vote_scribble POST   /scribbles/:id/vote(.:format)        scribbles#vote 

您可以通过运行rake routes来检查。

正如您所看到的,vote_scribble_path期待id占位符而非scribble_id这就是您收到错误的原因,因为Rails无法在您的应用中找到匹配的路由{{1使用占位符scribbles#vote进行操作。