2010-05-15 4 views
2

Я пытаюсь настроить простой вход с помощью AuthLogic в таблицу User. Каждый раз, когда я пытаюсь, логин терпит неудачу, и я не знаю, почему. Я уверен, что это простая ошибка, но я некоторое время бил кирпичную стену.Проблемы с настройкой AuthLogic

#user_sessions_controller 
def create 
@user_session = UserSession.new(params[:user_session]) 
    if @user_session.save 
    flash[:notice] = "Login successful!" 
    else 
    flash[:notice] = "We couldn't log you in. Please try again!" 
    redirect_to :controller => "index", :action => "index" 
    end 
end 

#_user_login.html.erb (this is the partial from my index page where Users log in) 
<% form_tag user_session_path do %> 
    <p><label for="login">Login:</label> 
<%= text_field_tag "login", nil, :class => "inputBox", :id => "login", 
    </p> 

    <p><label for="password">Password: </label> 
<%= password_field_tag "password", nil, :class => "inputBox", :id => "password", 
    </p> 

    <p><%= submit_tag "submit", :class => "submit" %></p> 
<% end %> 

У меня был Faker, который генерировал некоторые данные для моей таблицы пользователей, но я не могу войти в систему! Каждый раз, когда я пытаюсь, он просто перенаправляется на индекс. Где я иду не так? Спасибо всем.

------ ОБНОВЛЕНИЕ ------

Я реализовал предложение Якуба Hampl с form_for только сейчас - я получаю новую ошибку.

ActionView::TemplateError (called id for nil, which would mistakenly be 4 - 
1: <% form_for @user_session do |f| %> 
2: <% if flash[:notice] -%> 
3: <p class="notice"><%= flash[:notice] %></p> 
4: <% end -%> 

app/views/index/_user_login.html.erb:1 
app/views/layouts/index.html.erb:65 
app/controllers/index_controller.rb:3:in `index' 

Rendered rescues/_trace (86.0ms) 
Rendered rescues/_request_and_response (1.0ms) 
Rendering rescues/layout (internal_server_error) 

Я вообще не изменил контроллер. Спасибо всем, кто отвечает на эту тему - это невероятно полезно для меня. Что я могу сделать, чтобы преодолеть это препятствие?

------ UPDATE # 2 ------

Вот мой контроллер приложения.

def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
end 

def current_user 
    return @current_user if defined?(@current_user) 
    @current_user = current_user_session && current_user_session.user 
end 

def require_user 
    unless current_user 
store_location 
flash[:notice] = "You must be logged in to access this page" 
redirect_to login_path 
return false 
    end 
end 

def require_no_user 
    if current_user 
store_location 
flash[:notice] = "You must be logged out to access this page" 
redirect_to root_url 
return false 
    end 
end 

Какой из них следует изменить на @user_session?

+0

Связано ли @user_session с действием индексатора контроллера индекса? – x1a4

ответ

1

Хорошая идея состоит в том, чтобы использовать form_for, если это возможно:

<% form_for @user_session do |f| %> 
    <p> 
    <%= f.label :username %> 
    <%= f.text_field :username, :class => :inputBox %> 
    </p> 
    <p> 
    <%= f.label :password %> 
    <%= f.password_field :password, :class => :inputBox %> 
    </p> 
    <p><%= f.submit "submit", :class => :submit %></p> 
<% end %> 

Помимо этого трудно сказать. Предоставляет ли ваш файл журнала какие-либо подробности (например, ошибки)? Также попробуйте добавить к ошибкам на столбе, чтобы вы могли видеть, что происходит не так.

Поскольку последнее сообщение о том, что @user_session не установлено, похоже на последнее обновление, просто запустите его и создайте его: <% form_for UserSession.new do |f| %>.

+0

«login» отлично работает с authlogic. – x1a4

+0

Неплохо, спасибо за исправление. –

+0

Отредактировано в список редактирования OP. –

1

в вашем случае, params [: user_session] пуст, потому что он не установлен в вашем представлении. Я думаю, что предложение Jakub Hampl по использованию form_for - лучший способ, но вы также можете остаться с form_tag, установив имена ввода в user_session[login] и user_session[password], или вы можете изменить строку в своем действии на @user_session = UserSession.new(:login => params[:login], :password => params[:password]) .

+0

Это правильно. Вы можете подтвердить это, проверив журналы для этого запроса POST. Он будет иметь правильное поле, но они не привязаны к user_session, как ожидается, в контроллере. –

Смежные вопросы