【问题标题】: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,但它仍然没有帮助。你能提供任何代码吗?感谢您回复我。

标签: ruby-on-rails ruby-on-rails-3 controller url-routing


【解决方案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

【讨论】:

    猜你喜欢
    • 2020-01-22
    • 2022-07-05
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2011-06-08
    • 2017-01-18
    相关资源
    最近更新 更多