Rails направляет на неправильный URL - PullRequest
4 голосов
/ 23 января 2011

Я написал форму в представлениях не-пользовательской модели, позволяя посетителям входить в систему.Я хочу сначала проверить, работает ли это.Поэтому я выполняю действие «index» для прохождения теста.

<%form_tag(:controller=>"users",:action=>"index")  do %>
  Name: <%=text_field_tag "name"  %><br>    
  Password: <%=password_field_tag "password" %><br>
  <%=submit_tag "Login"  %>
<% end -%>

Удивительно, но маршрутизация rails направляет страницу в «новое» представление, пока на панели навигации браузера все еще отображается:

http://0.0.0.0:3000/users

Когда я обновляю страницу, она отображает обычную «индексную» страницу.

Почему это происходит?

Что еще более жутко, когда я изменил :action в приведенном выше коде на :action=>"new", на экране отображается «ошибка маршрутизации».Когда я обновляю его, он представляет обычный «новый» вид.

users_controller.rb выглядит следующим образом:

class UsersController < ApplicationController

  def index
    @users=User.all
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users }
    end
  end

  def show
    @user = User.find(params[:id])
    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @user }
    end
  end

  def login
    flash[:notice]="Hello";
  end

  def new

  end

  def create
    @user = User.new(params[:project])

    respond_to do |format|
      if @user.save
        format.html { redirect_to(@user, :notice => 'user was successfully created.') }
        format.xml  { render :xml => @user, :status => :created, :location => @user }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @user.errors, :status => :unprocessable_entity }
      end
    end
  end
end

Мой route.rb выглядит следующим образом:

Testdrive::Application.routes.draw do

  resources :users do
    member do
      post 'login'
    end
  end
  resources :cars 

Ответы [ 2 ]

5 голосов
/ 23 января 2011

Ответ Apneadiving является правильным, однако я думаю, что важно уточнить некоторые вещи:

На какую страницу вы пытаетесь попасть пользователю? Похоже, вы хотите, чтобы пользователь попал на страницу индекса (вы удивляетесь, что пользователь попадает на новую страницу).

Во-первых: вы должны понимать взаимосвязь между типом HTTP-запроса и местом, куда контроллер направляет браузер. Смотри http://guides.rubyonrails.org/routing.html#crud-verbs-and-actions

По сути, ваша форма отправляет запрос POST по адресу /users. Контроллер всегда направляет сообщения по этому адресу в действие CREATE. Таким образом, как объяснил Apneadiving, отправляемые вами пост-параметры - это не те, которых ожидает CREATE, поэтому сохранить не удается, и вы будете перенаправлены на users/new

Теперь я вижу, что в вашей форме вы указали: :controller => 'users', :action => 'index'. Итак, вот где я вижу, что вы хотите, чтобы люди попадали на главную страницу. Однако вам нужно понять, что помощники форм Rails магически не связаны со слоем контроллера.

Второе: Знайте, что поток информации в Rails в основном односторонний: вещи из модели могут идти к контроллеру, но не другим путем. Вещи из контроллера могут идти в представление, но не в другую сторону.

Единственное, что контроллер может получить от пользователя, - это HTTP-запрос. Когда вы используете помощники тегов формы, вы просто используете ярлык для определения атрибутов action и method элемента HTML form. См http://www.w3.org/TR/html401/interact/forms.html#h-17.13

Итак, даже если вы указали :action => 'index', ваша форма все еще отправляет запрос POST (по умолчанию создается POST). Контроллер не знает, что вы имели в виду запрос этого человека на действие index, он знает только то, что он получил POST, а не GET, по адресу /users. Поэтому он направляет этот запрос к действию CREATE.

Вот что такое REST.

Решение:

Вам нужно использовать действие, которое еще не предопределено. На ваших маршрутах это выглядит так, как будто вы пытались сделать это, когда вы добавили:

resources :users do
  member do
    post 'login'
  end
end

Этот код будет правильно принимать запросы POST к users/123/login.

Однако, поскольку вы указали это в ЧЛЕНЕ коллекции пользователя, а не в самой КОЛЛЕКЦИИ, вам придется предоставить конкретный USER_ID для правильной обработки этого запроса. Поскольку вы используете это действие для входа в систему, это не то, что вам нужно. См http://guides.rubyonrails.org/routing.html#nested-resources

Вместо этого вам нужно указать этот маршрут для КОЛЛЕКЦИИ (то есть: users/login):

resources :users do
  collection do
    post 'login'
  end
end

Затем в вашей форме измените тег формы на :controller => 'users', :action => 'login'.

Наконец, в вашем контроллере вам нужно указать действие входа в систему. В этом случае это может быть так просто:

def login
  redirect_to users_path
end

Все, что нужно будет сделать, это получить POST и перенаправить на индекс. Однако, если вы хотите, чтобы параметры из вашей формы были прикреплены, вам нужно обработать их в действии LOGIN. Они не будут сохраняться и будут доступны вашему действию INDEX после перенаправления.

Надеюсь, это прояснит для вас. Удачи!

2 голосов
/ 23 января 2011

Ваша проблема заключается в ваших маршрутах. Посмотрите здесь . Пример очень понятен:

resources :photos do
  member do
    get 'preview'
  end
end

Описание: «Это распознает / photos / 1 / preview with GET».

Итак, вернемся к вашему коду: строка post login не ведет туда, куда вы собираетесь.

Вместо этого почтовый запрос направляется в представление «создать», потому что это то, что вы спросили, набрав resources :users (см. здесь ). Поскольку он не сохранен должным образом, он перенаправляется в «новое» представление, потому что:

else
  format.html { render :action => "new" }

Так какое решение? Вот несколько треков:

  • проверьте ваши логи, они должны быть ресурсом для отладки
  • используйте rails s --debugger для установки точек останова и проверки ваших переменных
  • проверьте ваши параметры, я не понимаю, почему вы используете params[:project] для создания нового пользователя.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...