Обновление Rails: сервер говорит, что маршрут не существует, когда он существует! - PullRequest
0 голосов
/ 10 мая 2011

Дано:

Следующий частичный:

<%= 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 3.0.5.

Ответы [ 3 ]

0 голосов
/ 10 мая 2011

Попробуйте удалить :url => user_session_path из вашей формы. Указав form_for @user_session, Rails будет искать маршруты user_session RESTful и сгенерирует для вас URL.

0 голосов
/ 10 мая 2011

изменив :url => user_session_path на :url => {:action => :create} сделал свое дело.

0 голосов
/ 10 мая 2011

Ваш маршрут принимает только GET запросов. Форма отправляет запрос POST по умолчанию.

Edit: Сначала вы должны использовать названный маршрут вместо user_session_path:

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

И требуемое действие - create, а не new (который отображает форму):

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