在我routes.rb
我有以下内容:
get "contact" => "inquiries#new"
因此,当我在浏览器中转到/contact
时,它会调用InquiriesController
的{{1}}操作。
现在,当我尝试在new
内的创建操作中调用render "new"
时:
InquiriesController
浏览器中生成的网址为def create
…
render "new"
end
。
除了将/inquiries
调用到redirect_to
,还是在浏览器中将网址设为render "new"
之外,还有办法吗?
答案 0 :(得分:11)
简短的回答是否定的。这就是为什么:
render
与redirect_to
不同。当您编写redirect_to :action
时,您正在发起一个全新的浏览器请求。命中轨道堆栈,再次搜索路径并执行相应的操作。它与输入地址栏中的URL并按Enter键完全相同。
另一方面,当您使用render
时,您将告知当前请求使用哪个视图。因此,地址栏中的地址通常是您呼叫render
的操作。那是因为你放了一个地址,然后告诉rails在同一个请求中显示不同的页面。
简而言之,redirect_to
开始一个全新的请求周期时,render
只是将您在同一请求周期中选择的内容替换为默认视图。
因此,如果您想要更改地址栏,则必须向所需地址发起新请求。可以通过手动输入地址,单击指向该地址的链接或从rails重定向到该地址。
希望这有帮助。
答案 1 :(得分:5)
解决方案是使用自定义路由,如果使用Restful路由,只需将此行添加到routes.rb:
resources :inquiries, path: "contact", as: :inquiries, only: [:create]
此处,当操作名称为inquiries
时,您告诉rails将默认从 contact
更改为 create
如果您希望其他操作与以contact
开头的网址相匹配,只需将操作名称添加到“仅 ”,例如:only: [:create, :update ...]
< / p>
如果您希望all
actions in that controller
(查询)自定义为"contact"
,请删除only
,如下所示:
resources :inquiries, path: "contact", as: :inquiries
您查询控制器的所有路由都将从/inquiries
更改为/contact
有关如何自定义其余路线的详细信息,请查看此link
答案 2 :(得分:3)
在创建操作中使用render :new
时,它将使用表单发布到的相同网址。
因此,如果您想设置两个查询,您可以设置您的路线,如:
get '/contact', 'inquiries#new', as: 'contact'
post '/contact', 'inquiries#create'
您也可以使用resources
方法作为medBo引用,但我在做自定义操作时更喜欢普通的get
和post
。此外,这些路线可以与您现有的查询路线共存,而不会产生任何不良影响。
然后使用这些路线集,您可以通过写下来创建您的联系人:
<%= form_tag contacts_url do %>
...
<% end %>
这里重要的一步是,我们将表单设置为发布到“/ contact”而不是发布到“/ queries”。
答案 3 :(得分:2)
我认为您首先需要了解difference between redirect_to & render
/contact
网址
变化
render "new"
到
redirect_to "/contact"