Rails redirect_to post方法?

时间:2009-06-15 19:38:55

标签: ruby-on-rails ruby

    redirect_to :controller=>'groups',:action=>'invite'

但是我收到错误,因为redirect_to发送GET方法我想将此方法更改为'POST',redirect_中没有:method选项,我该怎么办?我可以在没有redirect_to的情况下这样做。

编辑:

我在群组/ invite.html.erb

中有这个
<%= link_to "Send invite", group_members_path(:group_member=>{:user_id=>friendship.friend.id,  :group_id=>@group.id,:sender_id=>current_user.id,:status=>"requested"}), :method => :post %>

此链接调用在group_members控制器中创建操作,并且在执行创建操作后,我想使用group_id显示groups / invite.html.erb(我的意思是在点击'发送邀请'group_members之后将创建,然后当前页面将是如上所示:

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id

在redirect_to使用GET方法请求后,它在组中调用show action并将邀请作为id并发出此错误

Couldn't find Group with ID=invite

我在群组中的邀请行动

    def invite
@friendships = current_user.friendships.find(:all,:conditions=>"status='accepted'")
@requested_friendships=current_user.requested_friendships.find(:all,:conditions=>"status='accepted'")
@group=Group.find(params[:group_id])
 end

解决方法是我必须使用POST方法重定向它,但我找不到方法。

丑陋的解决方案:我解决了这个我不喜欢的问题。如果你有公平的解决方案,我还在等。

我的解决方案是为邀请功能添加路线,以便摆脱“无法找到ID =邀请的群组”错误。

在routes.rb

   map.connect "/invite",:controller=>'groups',:action=>'invite'

in create action

   redirect_to "/invite?group_id=#{@group_member.group_id}"

我用英语'手工工人方法'中的语言'amele yontemi'称之为解决方案'(我认为)。

4 个答案:

答案 0 :(得分:36)

答案是您无法使用redirect_to进行POST。

这是因为redirect_to所做的只是向浏览器发送HTTP 30x重定向标头,而浏览器又会获取目标网址,而浏览器只会重定向GET

答案 1 :(得分:9)

听起来你正在被Rails路由的工作方式绊倒。这段代码:

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id

创建一个类似/groups/invite?group_id=1的网址。

如果没有routes.rb中的映射,Rails路由器会将其映射到show操作,而不是invite。 URL的invite部分映射到params[:id],当它尝试在数据库中查找该记录时,它会失败并且您会收到您找到的消息。

如果您使用的是RESTful路由,那么您已经拥有map.resources行,如下所示:

map.resources :groups

您需要为invite添加自定义操作:

map.resources :groups, :member => { :invite => :get }

然后将params[:group_id]方法中对#invite的引用更改为仅使用params[:id]

答案 2 :(得分:5)

我找到了一个半工作方式,我需要在Rails 3中实现这一点。我做了一个路由,可以在该控制器中调用需要后调用的方法。 “route.rb”中的一行,例如:

match '/create', :to => "content#create"

这可能是丑陋但绝望的时候需要绝望的措施。只是想我会分享。

答案 3 :(得分:1)

想法是在您使用方法:post生成表单的过程中进行“重定向”。

我遇到了同样的问题,并将解决方案提取到gem repost中,因此它正在为您完成所有工作,因此无需使用表单创建单独的视图,只需使用gem提供的视图即可。功能redirect_post()在您的控制器上。

class MyController < ActionController::Base
...
  def some_action
    redirect_post('url', params: {}, options: {})
  end
...
end

应该在红宝石上可用。