проверить наличие не работающих в тэге form_for - PullRequest
0 голосов
/ 27 января 2010

Это мой первый раз, когда я проверяю приложение rails. Я видел много уроков, которые казались легкими. Я не знаю, почему я не могу заставить его работать. Ниже моя установка.

Администратор контроллера (action = login)

  def login
    session[:user_id] = nil
    if request.post?
      @user = User.authenticate(params[:userId], params[:password])
      if true
        session[:user_id] = @user.user_id
        flash.now[:notice] = "Login Successful"
        redirect_to(:controller => "pages", :action => "mainpage")
      else
        flash.now[:notice] = "Invalid user/password combination"
      end
    end
  end

Таким образом, когда пользователь впервые приходит к администратору / логину, ему просто представляется форма ниже

login.erb.html

<% form_for :user do |f| %>
  <p><label for="name">User ID:</label> 
    <%= f.text_field :userid %>
  </p>
  <p><label for="password">Password:</label>
    <%= f.password_field :password%>
  </p>
  <p style="padding-left:100px">
    <%= submit_tag 'Login' %>
  </p>
<% end %>

Моя модель пользователя:

class User < ActiveRecord::Base
  validates_presence_of :userid, :password
  def self.authenticate(userid, password)
    user = self.find_by_userid_and_password(userid, password)
    user
  end
end

Фактические имена полей для ИД пользователя и пароля в моей БД: userid password

Я ожидаю поведения, когда пользователь ничего не вводит в поля и просто нажимает кнопку "Отправить". он скажет им, что ID пользователя и пароль являются обязательными полями. Однако этого не происходит

В консоли я вижу сообщения:

>> @user = User.new(:userid => "", :password => "dsf")
=> #<User id: nil, userid: "", password: "dsf", created_at: nil, updated_at: nil>
>> @user.save
=> false
>> @user.errors.full_messages
=> ["Userid can't be blank"]

Так что ошибка где-то в моей форме отправить ...

ОБНОВЛЕНИЕ : проверки происходят только тогда, когда вы СОХРАНИТЕ объект .... здесь я ничего не сохраняю. Так что в этом случае я должен сделать проверки JavaScript?

Ответы [ 2 ]

0 голосов
/ 27 января 2010

Оказывается, здесь есть несколько вопросов, и я постараюсь охватить их все. Начнем с вашей модели:

class User < ActiveRecord::Base
  validates_presence_of :userid, :password

  def self.authenticate(userid, password)
    self.find_by_userid_and_password(userid, password)
  end
end

Проверка не вступает в игру для входа в систему, а только для создания и обновления пользовательских записей. Аутентификация была обрезана, потому что ruby ​​автоматически возвращает последнее вычисленное значение в методе.

Далее, действие входа вашего контроллера:

def login
  session[:user_id] = nil
  if request.post?
    if @user = User.authenticate(params[:userId], params[:password])
      session[:user_id] = @user.user_id
      flash[:notice] = "Login Successful"
      redirect_to(:controller => "pages", :action => "mainpage")
    else
      flash.now[:error] = "Invalid user/password combination"
    end
  end
end

Обратите внимание, что мы не используем flash.now при перенаправлении - flash.now только в том случае, если вы НЕ перенаправляете, чтобы рельсы не показывали сообщение дважды.

Наконец, вы не должны использовать form_for, потому что это не спокойная форма ресурса. Вы не создаете и не редактируете пользователя, поэтому используйте вместо него form_tag:

<% form_tag url_for(:controller => :users, :action => :login), :method => :post do %>
  <%= content_tag(:p, flash[:error]) if flash[:error] %>

  <p><label for="name">User ID:</label> 
    <%= text_field_tag :userid %>
  </p>
  <p><label for="password">Password:</label>
    <%= password_field_tag :password%>
  </p>
  <p style="padding-left:100px">
    <%= submit_tag 'Login' %>
  </p>
<% end %>

Это будет делать то, что вы хотите. Это отличное упражнение для обучения, но если вы серьезно относитесь к аутентификации пользователей в производственном приложении, воспользуйтесь плагинами checkout rails, такими как restful_authentication или просвет, которые делают это для вас гораздо более сложным (и RESTful) способом.

0 голосов
/ 27 января 2010

Это строка if true. Измените его на

if @user = User.authenticate(params[:userId], params[:password])

или

@user = User.authenticate(params[:userId], params[:password])
if @user
  ...
end

Я бы также добавил redirect_to login_path к случаю отказа.

Вы также можете уменьшить свой метод аутентификации:

def self.authenticate(userid, password)
  find_by_userid_and_password(userid, password)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...