Выполнено 302 Обнаружено в Rails 3 Процесс регистрации только на Heroku - PullRequest
2 голосов
/ 10 февраля 2012

В моем приложении Rails 3 по какой-то причине я получаю 302 в процессе регистрации. В частности, когда я перенаправляю от создания нового пользователя к редактированию его профиля, меня перенаправляют из приложения на /login. Это происходит только на Heroku. Если я запускаю приложение локально, оно работает как надо.

Вот мой heroku logs:

2012-02-10T02:22:05+00:00 app[web.1]: Started POST "/users" for 98.218.231.113 at     2012-02-10 02:22:05 +0000
2012-02-10T02:22:05+00:00 app[web.1]: 
2012-02-10T02:22:05+00:00 app[web.1]: 
2012-02-10T02:22:06+00:00 app[web.1]:   Processing by UsersController#create as HTML
2012-02-10T02:22:06+00:00 app[web.1]: [paperclip] Saving attachments.
2012-02-10T02:22:06+00:00 app[web.1]: Rendered user_mailer/registration_confirmation.text.erb (0.4ms)
2012-02-10T02:22:06+00:00 app[web.1]: Completed 302 Found in 964ms
2012-02-10T02:22:06+00:00 app[web.1]: Sent mail to andy@dundermifflin.com (694ms)
2012-02-10T02:22:06+00:00 heroku[router]: POST myapp.org/users dyno=web.1 queue=0 wait=0ms service=984ms status=302 bytes=97
2012-02-10T02:22:06+00:00 app[web.1]: Redirected to http://myapp.org/signup/join
2012-02-10T02:22:06+00:00 app[web.1]:   Parameters: {"utf8"=>"✓", "authenticity_token"=>"4PjdAx5aaSph3KBDQfiPlJTlvTsh+DDTF1x+S7Ol2jc=", "user"=>{"profile_attributes"=>{"first_name"=>"Andrew", "last_name"=>"Bernard", "bio"=>""}, "email"=>"andy@dundermifflin.com", "password"=>"[FILTERED]"}, "commit"=>"Sign Up For myapp"}
2012-02-10T02:22:06+00:00 app[web.1]: Rendered user_mailer/registration_confirmation.html.erb (0.6ms)
2012-02-10T02:22:06+00:00 app[web.1]: 
2012-02-10T02:22:06+00:00 heroku[nginx]: 98.218.231.113 - - [10/Feb/    2012:02:22:06 +0000] "POST /users HTTP/1.1" 302 97 "http://myapp.org/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10" myapp.org
2012-02-10T02:22:06+00:00 app[web.1]: Started GET "/signup/join" for 98.218.231.113 at     2012-02-10 02:22:06 +0000
2012-02-10T02:22:06+00:00 app[web.1]: 
2012-02-10T02:22:06+00:00 app[web.1]: 
2012-02-10T02:22:06+00:00 heroku[router]: GET myapp.org/signup/join dyno=web.1 queue=0 wait=0ms service=29ms status=302 bytes=91
2012-02-10T02:22:06+00:00 app[web.1]:   Processing by ProfilesController#edit as HTML
2012-02-10T02:22:06+00:00 app[web.1]: Redirected to http://myapp.org/login
2012-02-10T02:22:06+00:00 app[web.1]: Completed 302 Found in 12ms
2012-02-10T02:22:06+00:00 heroku[nginx]: 98.218.231.113 - - [10/Feb/    2012:02:22:06 +0000] "GET /signup/join HTTP/1.1" 302 91 "http://myapp.org/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.53.11 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10" myapp.org
2012-02-10T02:22:06+00:00 app[web.1]: 
2012-02-10T02:22:06+00:00 app[web.1]: 
2012-02-10T02:22:06+00:00 app[web.1]: Started GET "/login" for 98.218.231.113 at     2012-02-10 02:22:06 +0000
2012-02-10T02:22:06+00:00 app[web.1]:   Processing by SessionsController#new as HTML
2012-02-10T02:22:06+00:00 app[web.1]: Rendered layouts/_footer.html.erb (0.6ms)
2012-02-10T02:22:06+00:00 heroku[router]: GET myapp.org/login dyno=web.1 queue=0 wait=0ms service=27ms status=200 bytes=3062

По моему users_controller.rb:

def create
  @user = User.new(params[:user])
  if @user.save
    session[:user_id] = @user.id
    redirect_to join_path, :notice => 'User successfully added.'
    UserMailer.registration_confirmation(@user).deliver
  else
    render :action => 'new'
  end
end

По моему routes.rb:

match "/signup/join" => "profiles#edit", :as => 'join'

Поэтому, если я посмотрю свои журналы, я отправлю POST на /users, отправлю электронное письмо и перенаправлюсь на действие edit в profiles_controller.rb. Кажется, все должно быть правильно, но меня перенаправляют. У кого-нибудь такое случалось?

ОБНОВЛЕНИЕ: По моему profiles_controller.rb:

class ProfilesController < ApplicationController
  before_filter :authenticate, :only => [:edit, :update]
  layout "application", :except => [:edit, :show]

  def user
    @user = current_user
  end

  def edit
    @profile = user.profile
    render :layout => "join_form"
  end

По моему sessions_controller.rb:

class SessionsController < ApplicationController  
  def new
  end

  def create
    if user = User.authenticate(params[:email].downcase, params[:password])
      session[:user_id] = user.id
      cookies.permanent[:auth_token] = user.auth_token
      if user.profile.higher_ed?
        redirect_to user.profile, :notice => "Logged in successfully"
      else
        redirect_to join_path, :notice => "Logged in successfully"
      end
    else
      flash.now[:alert] = "Invalid login/password. Try again!"
      render :action => 'new'
    end
  end

Мой gemfile:

source "http://rubygems.org"
gem "aws-s3", :require => "aws/s3"
gem "aws-sdk"
gem "cancan"
gem "cocaine"
gem "fastercsv"
gem "nifty-generators"
gem "jquery-rails", ">= 1.0.12"
gem "paperclip"
gem "rails", "3.0.5"
gem "rake", "0.9.2"
gem "ransack"
gem "twitter"
gem "mocha", :group => :test
group :production, :development, :test do
  gem "pg"
end
gem "pg"

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Как предложил @phoet выше, я начал удалять код, который потенциально мог вызвать проблемы, и у меня возникла ошибка, связанная с отсутствием метода, которая привела меня к моему решению. Мне пришлось переработать логику в моем методе current_user. Я изменил это с:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find_by_id(session[:user_id])
  @current_user ||= User.find_by_auth_token!(cookies[:auth_token]) if cookies[:auth_token]
end    

Кому:

def current_user
  @current_user ||= lookup_user
end

def lookup_user
  if cookies[:auth_token]
    User.find_by_auth_token!(cookies[:auth_token])
  elsif session[:user_id]
    User.find_by_id(session[:user_id])
  end
end
0 голосов
/ 08 января 2014

Я также получил эти 302 найденные проблемы, посмотрите, как они будут решены -

В моем случае я обращался к методу через контроллер, используя вызов AJAX, другой контроллер, я добавил authorize_resource как метод devise для аутентификации запроса.

Затем я пропустил определенный метод skip_authorize_resource: only =>: name_of_method (Action).

Это решит проблему.

Спасибо.

...