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'称之为解决方案'(我认为)。
答案 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
应该在红宝石上可用。