Rails 3:“:method =>:post”不起作用......当它'POST'时似乎是'GET'

时间:2011-01-25 22:23:28

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

我正在尝试按照 Railscast 163:Self Referential Assosication

中的说明在我的Rails 3应用中实施“友谊”

我按照描述设置了所有内容。我正在使用一个基本的用户模型登录Authlogic工作正常。但是,当我尝试使用以下链接添加朋友时:

<% for user in @users %>   
 <%=h user.username %> 
  <%= link_to "Add Friend", friendships_path(:friend_id => user), :method => :post %>     
<% end %>

我重定向到http://localhost:3000/friendships?friend_id=2并且未知操作无法找到FriendshipsController 错误的操作'index',没有进一步说明。这是特别奇怪的,因为我有一个硬编码重定向回到我当前用户的“User#show”方法(即在添加好友后重定向回配置文件)。

如果有帮助,这是我的“友谊#create”方法:

def create  
  @friendship = current_user.friendships.build(:friend_id => params[:friend_id])  
  if @friendship.save  
    flash[:notice] = "Added friend."  
    redirect_to :controller => 'users', :action => 'show', :id =>'current_user'
  else  
    flash[:notice] = "Unable to add friend."  
    redirect_to :controller => 'users', :action => 'show', :id =>'current_user' 
  end  
end

知道可能导致这种情况的原因是什么?我发现有人在这里有类似的问题,但我找不到明确的解决方法:Rails 3 and Friendship Models

提前感谢您的帮助!

〜丹

2 个答案:

答案 0 :(得分:10)

我认为link_to将参数放入查询字符串中,因为它是用html链接创建的,即使你输入:method =&gt; :如果js被禁用,则发帖。

你可以使用javascript:onclik event来发布帖子。

aniway,使用link_to方法:post通常是一个坏主意。 在rails中,您可以使用 button_to 帮助程序进行此pourpose,并将其设置为链接样式。

编辑:
在Rails3 doc中,似乎link_to在使用params调用时必须模拟button_to的相同行为:method =&gt;:post

  

(动态创建HTML表单和   立即提交表格)。

但即使启用了javascript,在Rails 3.0.3中对我来说也不是这样。 我会调查。

无论如何你应该使用按钮和表格来处理非GET的事情;超链接故意不允许GET以外的方法

EDIT2: 好, rails3不会创建内联表单来通过链接模拟发布请求。在Rails3中,data-method = post属性被添加到标记中,以通过javascript函数对其进行操作。这样,如果js被禁用,请求会在get调用中优雅地降级。

答案 1 :(得分:5)

这是一个迟到的答案,但它是这个问题的解决方案(至少它对我有用):

<%= link_to "Add Friend", {:controller => :friendships, :action => :create, :friend_id => user_id }, :method => :post %>     

我知道你的问题早就应该了,但它可能有助于某人:)