Rails将“action”呈现为自定义URL

时间:2013-08-06 10:03:16

标签: ruby-on-rails

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

get "contact" => "inquiries#new"

因此,当我在浏览器中转到/contact时,它会调用InquiriesController的{​​{1}}操作。

现在,当我尝试在new内的创建操作中调用render "new"时:

InquiriesController

浏览器中生成的网址为def create … render "new" end

除了将/inquiries调用到redirect_to,还是在浏览器中将网址设为render "new"之外,还有办法吗?

4 个答案:

答案 0 :(得分:11)

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

renderredirect_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引用,但我在做自定义操作时更喜欢普通的getpost。此外,这些路线可以与您现有的查询路线共存,而不会产生任何不良影响。

然后使用这些路线集,您可以通过写下来创建您的联系人:

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

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

答案 3 :(得分:2)

我认为您首先需要了解difference between redirect_to & render

/contact网址

变化

render "new"

redirect_to "/contact"