Как войти в систему сразу после регистрации? - PullRequest
2 голосов
/ 26 марта 2011

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

Кстати, я попытался render :template => 'sessions/create' в действии create контроллера пользователя, но яполучить эту ошибку при регистрации:

Template is missing

Missing template sessions/create with {:locale=>[:en, :en], :formats=>[:html], :handlers=>[:rjs, :rhtml, :erb, :rxml, :builder]} in view paths "/rubyprograms/dreamstill/app/views", "/rubyprograms/dreamstill/vendor/plugins/facebox_render/app/views"

Это все в моем контроллере приложения:

protected 
  # Returns the currently logged in user or nil if there isn't one
  def current_user
    return unless session[:user_id]
    @current_user ||= User.find_by_id(session[:user_id]) 
  end


  # Make current_user available in templates as a helper
  helper_method :current_user

  # Filter method to enforce a login requirement
  # Apply as a before_filter on any controller you want to protect
  def authenticate
    logged_in? ? true : access_denied
  end

  # Predicate method to test for a logged in user    
  def logged_in?
    current_user.is_a? User
  end

  # Make logged_in? available in templates as a helper
  helper_method :logged_in?

  def access_denied
    respond_to do |format|
      format.html do
        flash[:alert] = "You must log in to peform this action."
        redirect_to root_path
      end

      format.js do
        render_to_facebox(:partial => 'sessions/login_box')
      end
    end
     false
  end

Ответы [ 3 ]

5 голосов
/ 26 марта 2011

Где-то в ваших контроллерах есть что-то похожее на это:

user = User.new
# set attributes
user.save
render :template => 'sessions/create' # Probably based on your question

Все, что вам нужно сделать, это обновить session до:

user = User.new
# set attributes
if(user.save)
   session[:user_id] = user.id
   # Send them somewhere useful
else
   # Handle the error
end

Они подписаныза один раз session[:user_id] установлено.

1 голос
/ 26 марта 2011

Технически

В вашем контроллере, после создания вашего пользователя, этот код:

@current_user = user

должно помочь вам (похоже, вы используете restful_authentication).

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

0 голосов
/ 26 марта 2011

Вам кажется, что вы только начинаете с Rails, верно?Я настоятельно рекомендую вам использовать гем типа Devise для обработки ваших пользовательских регистраций.

Однако, если вы настаиваете на том, чтобы делать это вручную, вам просто нужно создать переменную сеанса, которая проверяет, вошел ли пользователь в систему.или нет.Затем вы можете добавить помощника типа current_user, чтобы получить пользователя, если сеанс пользователя показывает, что он / она вошел в систему.

Я вижу, что у вас есть контроллер сеансов.Вы пытаетесь использовать restful_authentication?Если это так, еще раз я настоятельно рекомендую перейти на Devise:)

СТАРЫЙ КОД С ИСПОЛЬЗОВАНИЕМ RESTFUL AUTHENTICATION - КОНТРОЛЛЕР СЕССИЙ

# This controller handles the login/logout function of the site.  
class SessionsController < ApplicationController
  # Be sure to include AuthenticationSystem in Application Controller instead
  include AuthenticatedSystem

  # render new.erb.html
  def new
  end

  def create
    logout_keeping_session!
    user = User.authenticate(params[:login], params[:password])
    if user
      # Protects against session fixation attacks, causes request forgery
      # protection if user resubmits an earlier form using back
      # button. Uncomment if you understand the tradeoffs.
      # reset_session
      self.current_user = user
      new_cookie_flag = (params[:remember_me] == "1")
      handle_remember_cookie! new_cookie_flag
      flash[:notice] = "Logged in successfully"
      redirect_to :controller=>'Town'
    else
      note_failed_signin
      @login       = params[:login]
      @remember_me = params[:remember_me]
      render :action => 'new'
    end
  end

  def destroy
    logout_killing_session!
    flash[:notice] = "You have been logged out."
    redirect_back_or_default('/')
  end

protected
  # Track failed login attempts
  def note_failed_signin
    flash[:error] = "Couldn't log you in as '#{params[:login]}'"
    logger.warn "Failed login for '#{params[:login]}' from #{request.remote_ip} at #{Time.now.utc}"
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...