我在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
对此有什么解决方法?
答案 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)