2013-05-03 93 views
1

我试图在删除后重定向,具体取决于用户来自何处。删除后的Rails条件重定向

这是当前的代码在事件控制器:

def destroy 
    @event = Event.find(params[:id]) 
    @event.destroy 

    respond_to do |format| 
    format.html { redirect_to events_url } 
    format.json { head :no_content } 
    end 
end 

我改成了这个(感谢MrYoshiji):

format.html { redirect_to :back } 

这工作,如果用户从除了所有页面删除活动显示页面。因为您在尝试显示刚刚删除的记录时出现错误。

所以,我试图用一个参数告诉破坏代码重定向到哪里。

我想这一点:

def destroy 
    @event = Event.find(params[:id]) 
    @event.destroy 
    @return_url 

    respond_to do |format| 
    format.html { redirect_to @return_url } 
    format.json { head :no_content } 
    end 
end 

但是,我不知道如何@return_url传递作为一个展示页面上的link_to设置了一个param。

<%= link_to 'Delete', @event, params(@return_url => "some url"), confirm: 'Are you sure?', method: :delete, :class => 'btn btn-danger' %> 

如何将网址作为参数传递?

谢谢!

UPDATE1

我改变了事件控制器这样:

def destroy 
    @expense = Expense.find(params[:id]) 
    redirect_url = (request.referer.include?("#{@event.id}/show") ? events_url : :back) 
    @expense.destroy 

    respond_to do |format| 
    format.html { redirect_to redirect_url } 
    format.json { head :ok } 
    end 
end 

这重定向到正确的页面中的“删除事件”按钮上 - 除了当我点击显示网页上的按钮为事件。

重定向想要显示已删除的记录。

UDPATE2

确定这个工作对我的应用程序:

redirect_url = (request.referer.include?("/events/#{@event.id}") ? events_url : :back) 

感谢所有帮助!

+0

后'return_url =(request.referer.include?('show')?::back)'然后'redirect_to return_url' – MrYoshiji 2013-05-03 17:08:56

+0

@MrYoshiji几乎就在那里,但是这会得到任何'show' URL,不是吗? – fotanus 2013-05-03 17:10:16

+0

对于嵌套路由,您没有'show'关键字,例如我的一个深层嵌套路由:'http://127.0.0.1:3000/settings/organizations/1/clinics/1/edit'但是你是对,它应该是'include?(“#{@ current_resource.id}/show”)' – MrYoshiji 2013-05-03 17:12:20

回答

5

正如我评论,你可以做到以下几点:

def destroy 
    @event = Event.find(params[:id]) 
    @event.destroy 
    redirect_url = (request.referer.include?("#{@event.id}/show") ? events_url : :back) 

    respond_to do |format| 
    format.html { redirect_to redirect_url } 
    format.json { head :no_content } 
    end 
end 

(我不知道如果没有可以访问@event.id您删除后马上,摧毁它,我们设置redirect_url

+0

感谢您的帮助!在问题中查看我的UPDATE1。 – Reddirt 2013-05-03 18:37:15

+0

我很难理解redirect_url语句在做什么。是否测试了解最后一页是否是活动/展示页面?显示页面有这个网址'http:// localhost:5000/events/29' – Reddirt 2013-05-03 18:44:14

+1

它应该是什么样的(“events/#{@event.id}”) – Reddirt 2013-05-03 18:51:25

0

在你看来:

<%= link_to 'Delete', event_path(@event, url), confirm: 'Are you sure?', method: :delete, :class => 'btn btn-danger' %> 

在这里,我传递url变量作为参数传递给控制器​​。

在控制器:

... 
@return_url = params[:url] 
... 

希望这有助于!

+1

从视图中传递原始URL是不好的。 – drhenner 2013-05-03 17:18:25

+0

递增drhenner评论,它可以用于探索漏洞 – fotanus 2013-05-03 17:19:06

+0

谢谢,我现在没有。我只是回答说:“但是,我不知道如何在显示页面的link_to中将@return_url作为参数传递给参数。” – cortex 2013-05-03 17:25:22