4

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

get "contact" => "inquiries#new"

这样当我进入/contact浏览器时,它会调用InquiriesController'new动作。

现在,当我尝试render "new"在里面调用创建操作时InquiriesController

def create
    …
    render "new"
end

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

除了调用redirect_to到浏览器中render "new"的网址之外,还有其他方法吗?/contact

4

4 回答 4

13

简短的回答是否定的。原因如下:

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

另一方面,当您使用 时render,您是在告诉当前请求使用哪个视图。因此,地址栏中的地址通常是您正在调用的操作render。那是因为你输入了一个地址,然后你告诉 rails 在同一个请求中显示不同的页面。

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

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

希望这可以帮助。

于 2013-08-06T10:19:04.337 回答
5

解决方案是使用自定义路由,如果您使用 Restful 路由,您可以简单地将这一行添加到您的 routes.rb :

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

在这里,您告诉 rails 将默认情况下的 url inquiries 更改 contact为 动作名称为create

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

如果您希望all将您的actions in that controller(查询)定制为像这样"contact"删除only

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

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

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

于 2013-08-06T12:42:18.100 回答
3

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

因此,如果您想设置两个查询,您可以设置您的路线,例如:

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

您也可以将该resources方法用作 medBo 引用,但我更喜欢普通的旧方法get以及post在我做自定义事情时。此外,这些路线可以与您现有的查询路线共存,而不会产生任何不良影响。

然后使用这些路由集,您可以通过以下方式创建您的联系人:

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

这里重要的一步是,我们将表单设置为发布到“/contact”,而不是发布到“/inquiries”。

于 2014-09-26T03:26:47.607 回答
2

我想你首先需要了解difference between redirect_to & render

对于/contact网址

改变

render "new"

redirect_to "/contact"
于 2013-08-06T10:07:58.953 回答