Rails将"action"呈现为自定义URL

use*_*093 4 ruby-on-rails

在我,routes.rb我有以下内容:

get "contact" => "inquiries#new"
Run Code Online (Sandbox Code Playgroud)

因此,当我进入/contact浏览器时,它会调用它InquiriesControllernew动作.

现在,当我尝试调用render "new"内部的create动作时InquiriesController:

def create
    …
    render "new"
end
Run Code Online (Sandbox Code Playgroud)

浏览器中生成的URL是/inquiries.

有没有办法除了打电话redirect_to,render "new"但有/contact浏览器中的网址?

Aka*_*wal 12

简短的回答是否定的.这就是为什么:

render不同于redirect_to.当您编写时redirect_to :action,您正在发起一个全新的浏览器请求.命中轨道堆栈,再次搜索路由并执行相应的操作.它与在地址栏中输入url并按Enter键完全相同.

另一方面,当您使用时render,您将告知当前请求使用哪个视图.因此,地址栏中的地址通常是您要呼叫的操作render.那是因为你放了一个地址,然后告诉rails在同一个请求中显示不同的页面.

简而言之,在redirect_to开始一个全新的请求周期时,render只需用您在同一请求周期中选择的内容替换默认视图.

因此,如果您希望更改地址栏,则必须向所需地址发起新请求.它可以通过手动输入地址,单击指向该地址的链接或从rails重定向到该地址.

希望这可以帮助.

  • 是不是可以调用一些 javascript 代码来改变它?Turbolinks 已经在使用浏览器历史记录和 AJAX 请求做类似的事情。这个“不”很可能已经过时了。 (2认同)

med*_*zid 5

解决方案是使用自定义路由,如果使用Restful路由,只需将此行添加到routes.rb:

resources :inquiries, path: "contact", as: :inquiries, only: [:create]
Run Code Online (Sandbox Code Playgroud)

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

如果您希望其他操作匹配开头的网址contact,只需将操作名称添加到" ",例如: only: [:create, :update ...]

如果你想要自定义all你的actions in that controller(查询)就像这样"contact"删除only:

resources :inquiries, path: "contact", as: :inquiries
Run Code Online (Sandbox Code Playgroud)

并且所有查询控制器的路径将从更改/inquiries/contact

有关如何自定义休息路线的更多详细信息,请查看此链接