link_to未触发操作

时间:2015-04-08 10:11:02

标签: ruby-on-rails ruby-on-rails-4.2

我在index.html.erb中有以下内容(广告post的重要部分已宣布)

<%=link_to yay_post_path(post), :remote=>true, class:'btn-default btn' do %>
  <span class="glyphicon glyphicon-chevron-up"></span>
<% end %>
<%=link_to nah_post_path(post), :remote=>true, class:'btn btn-default' do %>
  <span class="glyphicon glyphicon-chevron-down"></span>
<%end %>

这在route.rb

resources :posts do
   member do
    put 'yay', to: 'posts#yay'
    put 'nah', to: 'posts#nah'
  end
end

这在PostsController

  def yay
    @post = Post.find(params[:id])
    @post.liked_by current_user
    @redirect_to @post
  end

  def nah
    @post = Post.find(params[:id])
    @post.downvote_from current_user
    @redirect_to @post
  end

请注意,上述方法没有自己的观点。它们只是自定义方法。

当我点击链接时,我收到404错误说

cannot find /post/1/yay

对此有什么解决方法?

2 个答案:

答案 0 :(得分:1)

您使用html方法put在路由器中声明路径,因此您必须相应地调整链接。普通链接始终为http GET,但是当您编写时,rails会帮助您:

<%=link_to yay_post_path(post), remote: true, method: :put, class:'btn-default btn' do %>
  <span class="glyphicon glyphicon-chevron-up"></span>
<% end %>

所以如果它与默认值不同,你必须显式添加它。

[编辑:处理控制器中的js] 要处理控制器中的js,有两个选项:

什么都不返回

def yay
  respond_to do |format|
    format.js do 
      @post = Post.find(params[:id])
      @post.liked_by current_user
      head :ok
    end
  end
end

注意:对于html调用,这将返回http状态406,这是我想要的:)

更标准的方法是

def yay
  @post = Post.find(params[:id])
  @post.liked_by current_user
  respond_to do |format|
    format.html { @redirect_to @post }
    format.js   { head :ok }
  end
end

但这取决于您想要支持的内容(例如,允许回退到标准HTML)。

如果你想更新我想要的视图(否则它们可以继续进行,并且不管你那个浏览器端),你可以做类似的事情:

def yay
  respond_to do |format|
    format.js do 
      @post = Post.find(params[:id])
      @post.liked_by current_user
    end
  end
end

并添加一个名为yay.js.erb的视图,其中包含

$('#yays_and_nays').hide()

或者例如更新视图的一部分

$(#yays_and_nays').replaceWith('<% escape_javascript(render 'yay_or_nayed_status') %>');

答案 1 :(得分:0)

在你的路线......

put 'yay', to: 'posts#yay'

PUT,因此您需要在:method=>"put"中加入link_to ..请参阅此ApiDock