Rails redirect_to post方法?

12 ruby ruby-on-rails

    redirect_to :controller=>'groups',:action=>'invite'
Run Code Online (Sandbox Code Playgroud)

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

编辑:

我在groups/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 %>
Run Code Online (Sandbox Code Playgroud)

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

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id
Run Code Online (Sandbox Code Playgroud)

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

Couldn't find Group with ID=invite
Run Code Online (Sandbox Code Playgroud)

我在小组中的邀请行动

    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
Run Code Online (Sandbox Code Playgroud)

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

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

我的解决方案是为邀请添加"无法找到具有ID =邀请的群组"错误的添加路由.

在routes.rb中

   map.connect "/invite",:controller=>'groups',:action=>'invite'
Run Code Online (Sandbox Code Playgroud)

在创建行动

   redirect_to "/invite?group_id=#{@group_member.group_id}"
Run Code Online (Sandbox Code Playgroud)

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

Luc*_*caM 36

答案是你不能使用a进行POST redirect_to.

这是因为redirect_to只需将HTTP 30x重定向标头发送到浏览器,然后浏览器获取目标URL,浏览器只对重定向进行GET操作

  • 是的我得到了这个但有没有办法用redirect_to或没有解决我的问题? (4认同)

Ste*_*sen 9

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

redirect_to :controller=>'groups',:action=>'invite',:group_id=>@group_member.group_id
Run Code Online (Sandbox Code Playgroud)

创建一个类似于的URL /groups/invite?group_id=1.

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

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

map.resources :groups
Run Code Online (Sandbox Code Playgroud)

您需要为以下内容添加自定义操作invite:

map.resources :groups, :member => { :invite => :get }
Run Code Online (Sandbox Code Playgroud)

然后params[:group_id]#invite方法中更改您的引用以便使用params[:id].


小智 5

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

match '/create', :to => "content#create"
Run Code Online (Sandbox Code Playgroud)

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