我在Rails 4上。
刚刚创建了一个收藏夹模型&控制器,用户可以在其中收藏文章。我已经设置好了,当用户点击链接时,它会路由到favorites_controller中最喜欢的动作。现在,它是一个get
请求,在操作的内部,它只是创建一个新的收藏夹。
我的问题是…这是get
请求可以吗?我觉得post
请求可能会更好(因为表单使用post来创建东西),但由于这种情况下没有表单,我决定get
请求也可以。这样可以吗?还是皱着眉头?
这是我认为的链接:
<%= link_to favorite_path(title: @article.title, id: @article.id) do %>
<span class="glyphicon glyphicon-star-empty"></span>
<% end %>
以及它在控制器中路由到的动作:
def favorite
current_user.favorites.create(article_id: params[:id],
article_title: params[:title])
flash[:success] = "You added this page to your favorites."
redirect_to request.referrer || root_url
end
和我的路线。rb:
get 'favorite' => 'favorites#favorite'
一切都很好,只是想澄清一下get
的请求,以及这是否是实现我正在做的事情的最佳方式。如果已经有关于这方面的文件,请通过我的方式发送。
不,您不应该使用get
请求来创建事物或更改状态。
原因很简单:搜索引擎会跟踪链接并触发该操作。或者一些浏览器可能会预加载链接以加快速度。在这两种情况下,您都将创建记录,尽管用户从未选择单击链接。
相反,只需告诉Rails使用一些javascript来伪造post请求(注意method: :post
部分):
<%= link_to(favorite_path(title: @article.title, id: @article.id),
method: :post) do %>
<span class="glyphicon glyphicon-star-empty"></span>
<% end %>
有关详细信息,请阅读有关link_to
的文档。