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'
该路由只会匹配/contact
到FeedbackController#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_3_question :as => 为啥在设置 slug 后我的 /posts/new 路由到 posts/show
从 ruby on rails 中删除 new.haml/new.erb?