Rails:为啥调用`render 'new'`时自定义url会改变?

Posted

技术标签:

【中文标题】Rails:为啥调用`render \'new\'`时自定义url会改变?【英文标题】:Rails: Why does custom url change when `render 'new'` is called?Rails:为什么调用`render 'new'`时自定义url会改变? 【发布时间】:2011-02-08 12:04:57 【问题描述】:

我有一个控制器,用于控制联系页面上的联系我们表单。在routes.rb 文件中,我有一行写着match '/contact', :to => 'feedback#new'。现在,当表格填写正确时,一切正常;网址是“/联系人”。但是,当表格填写不正确时,我的控制器 renders 'new' 和 url 从 '/contact' 更改为 '/feedback'。有人可以告诉我为什么会发生这种情况以及如何解决它,以便在触发验证并呈现页面时,url 仍然是/contact 而不是/feedback?谢谢!

我的控制器代码:

【问题讨论】:

您能列出您的config/routes.rb 文件的内容吗? Edit 视图代码也会有所帮助。如果您使用form_for(@feedback),当表单发布时,它会向/feedback 发送POST,因为Rails 使用RESTful URL。请记住,URL 基于控制器和操作的路由,而不是您正在呈现的视图的名称。 FeedbackController#create 可能映射到 /feedback(检查 rake routes 你是对的 FeedbackController#create 映射到 /feedback 路由。那么我该怎么做才能回答我上面的问题呢? 你有没有想过这个问题?我正在为此苦苦挣扎。 @skaz - 是也不是。我发现如果你在控制器的 create 动作中设置标题,当调用 render 时,url 仍然会设置为你想要的;但是,我不确定这是应该如何完成的,还是只是一个快速修复。我仍然不知道为什么会这样。 我在我的创建中设置了@title,但它仍然没有帮助。你能提供任何代码吗?感谢您回复我。 【参考方案1】:
match '/contact', :to => 'feedback#new'

该路由只会匹配/contactFeedbackController#new

您需要添加以匹配“帖子”部分到FeedbackController#create

match '/contact', :to => 'feedback#create', :via => :post, :as => :post_contact
# change :as => to whatever path for this you'd like to use, ex :as => :create_contact

您的表单现在将更改为

= form_for(@feedback), :url => post_contact_path do |f|

仅使用默认的form_for 将尝试从您的routes.rb 中的resources 创建路径。而且,我假设路由是resources :feedback,这当然会创建看起来像/feedback 的路由。

【讨论】:

仅供参考,我必须将 :via => :get 添加到 Rails 3 中的#new 路径。【参考方案2】:

在您的 routes.rb 中而不是您的 /contact 匹配器中使用:

resources :contact, :as => :feedback, :controller => :feedback, :only => [:new, :create]

http://guides.rubyonrails.org/routing.html#customizing-resourceful-routes

【讨论】:

以上是关于Rails:为啥调用`render 'new'`时自定义url会改变?的主要内容,如果未能解决你的问题,请参考以下文章

Rails/ERB 与 Redcarpet:HTML 消失

rails_3_question :as => 为啥在设置 slug 后我的 /posts/new 路由到 posts/show

从 ruby​​ on rails 中删除 new.haml/new.erb?

Rails 6.1.4 弃用警告:使用“。”呈现操作

c#里为啥有的使用时函数需要new一个对象而有的不用?为啥不直接调用就好?

为啥 Flow 不能用 document.getElementById(...) 调用 ReactDOM.render