【问题标题】:Rails Upgrade: server says a route doesn't exist when it does!Rails 升级:服务器说路由不存在!
【发布时间】:2011-05-09 22:49:46
【问题描述】:

鉴于:

以下部分:

<%= form_for @user_session, :url => user_session_path do |f| %>
  <%= f.error_messages %>
  <span class="field-group">
    <div>
      <%= f.label :login, "Login Name:" %><br />
      <%= f.text_field :login %><br />
    </div>
  </span>
  <div class="clear"></div>
  <span class="field-group">
    <div>
      <%= f.label :password, "Password:" %><br />
      <%= f.password_field :password %> <span class="hint">Reminder: Your password is case sensitive.</span><br />
    </div>
  </span>
  <div class="clear"></div>
  <span class="field-group">
    <div>
      <%= f.check_box :remember_me %> <%= f.label :remember_me %>
    </div>
  </span>
  <div class="clear"></div>
  <%= f.submit "Login" %>
<% end %>

还有以下路线:

$ rake routes | grep user_session | grep show
user_session GET /user_session/:id(.:format) {:action=>"show", :controller=>"user_session"}

以及如下路由配置:

# user session stuff
resources :user_session do
  member do
    put :forgot_password
    put :terms
    get :terms
  end
end  
match '/login', :to => 'user_sessions#new', :as => 'login'
match '/logout', :to => 'user_sessions#destroy', :as => 'logout'

问题:

当我调用使用此部分的页面时,我收到以下错误:

ActionController::RoutingError in User_sessions#new

Showing /app/views/edit_shared/_login.html.erb where line #2 raised:

No route matches {:action=>"show", :controller=>"user_session"}

提取的源代码(第 2 行附近):

1: 
2:     <%= form_for @user_session, :url => user_session_path do |f| %>
3:       <%= f.error_messages %>
4:       <span class="field-group">
5:         <div>

所以这条路线存在,但 rails 说它不存在。那么给了什么?在我开始升级到 Rails 3.0.5 之前一直很好。

【问题讨论】:

    标签: ruby-on-rails-3 routes rails-3-upgrade


    【解决方案1】:

    尝试从您的表单中删除:url =&gt; user_session_path。通过指定 form_for @user_session,Rails 将查找 user_session RESTful 路由并为您生成 URL。

    【讨论】:

      【解决方案2】:

      :url =&gt; user_session_path 更改为:url =&gt; {:action =&gt; :create} 就成功了。

      【讨论】:

      • 但是 URL 可能不是“/login”。也许这部分并不重要。在这种情况下,我建议您应用 Brandon 的答案。
      【解决方案3】:

      您的路由只接受GET 请求。表单默认发送POST 请求。

      编辑: 首先你应该使用你的命名路由而不是user_session_path

      <%= form_for @user_session, :url => login_path do |f| %>
      

      您想要的操作是create,而不是new(显示表单):

      match '/login', :to => 'user_sessions#create', :as => 'login'
      

      【讨论】:

      • ël,请参阅我的编辑。我添加了我的user_session 路由信息。我认为使用resources :user_session do ... end 足以获得路由所需的内容。我应该添加什么?
      猜你喜欢
      • 2012-11-13
      • 2021-02-08
      • 1970-01-01
      • 2010-10-25
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多