2013-08-06 55 views
4

在我routes.rb我有以下几点:Rails的渲染“行动”自定义URL

get "contact" => "inquiries#new" 

所以,当我去/contact在browswer,它调用InquiriesControllernew行动。

现在,当我尝试调用render "new"在创建行动中InquiriesController

def create 
    … 
    render "new" 
end 

在浏览器中所得网址为/inquiries

除了拨打redirect_torender "new"之外还有什么方法可以在浏览器中使用url作为/contact吗?

+0

我同意你应该redirect_to如果你想要你的地址是/联系,但为什么这样做?我认为你的访问者没有任何问题可以看到从联系人到查询的链接改变! – medBo

回答

10

简短答案是否定这里的原因:

render不同于redirect_to。当您编写redirect_to :action时,您正在启动一个全新的浏览器请求。击中轨道堆栈,再次搜索路线并执行相应的操作。它与在地址栏中输入网址并按下回车完全相同。

另一方面,当您使用render时,您正在告诉哪个视图用于当前请求。因此,地址栏中的地址通常是您致电render的操作。这是因为你放了一个地址,然后你告诉轨道在同一请求中显示不同的页面。

简而言之,虽然redirect_to开始一个全新的请求周期,但render只是将您在默认视图中选择的默认视图替换为相同的请求周期。

所以,如果你想要更改地址栏,你将不得不发起一个新的请求到你想要的地址。可以通过手动输入地址,单击该地址的链接或从导轨重定向到该地址。

希望这会有所帮助。

+1

是不是可以调用一些JavaScript代码来改变它? Turbolinks已经在做与浏览器历史和AJAX请求类似的东西。 “不”最有可能过时。 –

5

解决方案是使用自定义路由,如果您使用Restful路由,您可以简单地将此行添加到您的路由。RB:

resources :inquiries, path: "contact", as: :inquiries, only: [:create] 

在这里你告诉Rails默认inquiriescontact改变URL时动作的名称是create

,如果你希望其他行动来匹配网址是开始与contact,只需将行动的名称添加到“只有”,例如:only: [:create, :update ...]

如果你想allactions in that controller(查询)进行定制,以"contact"只是删除only这样的:

resources :inquiries, path: "contact", as: :inquiries 

,疑问的所有路由控制器将从/inquiries有关如何定制宁静的变化/contact

了解更多详情路线请检查此link

3

在创建操作中使用render :new时,它将使用表单发布到的相同URL。

因此,如果你想建立双方的询问,你可以设置你的路线,如:

get '/contact', 'inquiries#new', as: 'contact' 
post '/contact', 'inquiries#create' 

您也可以使用resources方法medBo引用,但我只是喜欢老式get和当我正在做自定义的事情时。此外,这些路线可以与您现有的查询路线共存,不会有任何不良影响。

然后用这些路由集,您可以通过书面形式创建联系人:

<%= form_tag contacts_url do %> 
    ... 
<% end %> 

这里最重要的一步,是我们设立的形式张贴到`/接触“而不是发布到” /查询。

+0

这工作完美,谢谢你的帮助:) – george