Итак, я работаю с authlogic и пытаюсь продублировать функцию входа в систему на странице приветствия, чтобы вы могли войти в систему с помощью URL-адреса restful или просто перейдя на главную страницу. Нет, я не знаю, сохраним ли мы эту функцию, но я все равно хочу ее проверить. Вот сообщение об ошибке:
RuntimeError in Welcome#index
Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id
Код ниже. По сути, происходит то, что представление индекса (первый фрагмент кода) отправляет информацию из формы в метод create контроллера user_sessions. На данный момент, теоретически, его создание должно просто забрать, но это не так.
ПОЖАЛУЙСТА, помогите. Пожалуйста. Я занимаюсь этим около 8 часов. Я проверил Google. Я проверил IRC. Я проверил каждую книгу, которую смог найти. Тебе даже не нужно отвечать, я могу выполнить грубую работу, если ты просто укажешь мне правильное направление.
=== РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЕ РЕДАКТИРОВАНИЕ ===
Самера была достаточно хороша, чтобы дать ответ на проблему. Открытый вопрос, однако, каков наилучший способ организовать приложение? Является ли применение объекта @user_sessions в before_filter приемлемым или есть более удобный способ сделать это?
WELCOME # INDEX
<% form_for @user_session, :url => user_sessions_path do |f| %>
<%= f.text_field :email %><br />
<%= f.password_field :password %>
<%= submit_tag 'Login' %>
<% end %>
КОНТРОЛЛЕР ПРИМЕНЕНИЯ
class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time
protect_from_forgery # See ActionController::RequestForgeryProtection for details
# Scrub sensitive parameters from your log
# filter_parameter_logging :password
helper_method :current_user_session, :current_user
before_filter :new_session_object
protected
def new_session_object
unless current_user
@user_session = UserSession.new(params[:user_session])
end
end
private
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.record
end
end<pre></code>
КОНТРОЛЛЕР СЕССИЙ ПОЛЬЗОВАТЕЛЯ
class UserSessionsController < ApplicationController
def new
@user_session = UserSession.new
end
def create
@user_session = UserSession.new(params[:user_session])
if @user_session.save
flash[:notice] = "Logged in"
redirect_to root_url
else
render :controller => 'user_sessions', :action => 'new'
end
end
def destroy
@user_session = UserSession.find
@user_session.destroy
flash[:notice] = "Logged out"
redirect_to root_url
end
end
Более подробный STACK TRACE
1: <h1>Welcome#index</h1>
2: <p>Find me in app/views/welcome/index.html.erb</p>
3:
4: <% form_for @user_session, :url => user_sessions_path do |f| %>
5: <%= f.text_field :email %><br />
6: <%= f.password_field :password %>
7: <%= submit_tag 'Login' %>
Application Trace | Framework Trace | Full Trace
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/actionpac -2.3.5/lib/action_controller/record_identifier.rb:76:in `dom_id'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_view/helpers/record_identification_helper.rb:16:in `dom_id'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:293:in `apply_form_for_options!'
/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/gems/1.8/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:277:in `form_for'
/Users/alex/Desktop/anglic/app/views/welcome/index.html.erb:4:in `_run_erb_app47views47welcome47index46html46erb'