2015-02-10 3 views
0

Я прошел через ряд подобных вопросов, но все еще не могу определить множественные перенаправления в своем действии. Можете ли вы мне помочь? Также есть ли общие подсказки для избежания так называемой Double Render Error?Rails: Помогите определить множественное перенаправление в этом действии, пожалуйста

Код выглядит следующим образом:

def st_buy_now_process 
    #create user in system 
    encrypted = BCrypt::Password.create(params[:password]) 
    if (User.where("email = ?", params[:email]).exists?)  
    flash[:alert] = 'User exists. Please try again.'  
    redirect_to "/st_buy_now"   
    elsif (User.create(email: params[:email], encrypted_password: encrypted)) 
    begin 
     customer = Stripe::Customer.create({ 
     :description => params[:email], 
     :card => { 
      :number => params[:cc], 
      :exp_month => params[:exp_1], 
      :exp_year => params[:exp_2], 
      :cvc => params[:cvc], 
      :name => params[:name] 
     }, 
     :email => params['email'] 
     })    
     p="#{params['plan']}_#{params['billing-cycle']}" 
     subscr = customer.subscriptions.create(:plan => p) 
     user = User.where("email = ?", params[:email]).first 
     user.payg = ({:cus_id => customer.id, :subscr_id => subscr.id}).to_json 
     user.plan = p 
     user.save 
    rescue Stripe::CardError => e   
     flash[:alert] = 'Please try again' 
     redirect_to "/st_buy_now" 
    end 
    RestClient.post "https://api:key-nnnn", 
     :from => "<[email protected]>", 
     :to => "#{params[:email]}", 
     :subject => "Welcome to test", 
     :text => "\n\n\n#{File.read("app/views/misc/mail_sign_up.txt")}\n\n\n" 
    cookies['logged_in'] = { 
     :value => '1', 
    } 
    cookies['us_id'] = { 
     :value => params[:email], 
    }  
    flash[:notice] = 'Registration successful.' 
    redirect_to :controller => 'misc', :action => 'create_1' 
    else 
    flash[:alert] = 'Please try again' 
    redirect_to "/st_buy_now" 
    end 
end 

сообщение об ошибке указывает на последний, но один редирект - линия после "Registration successful." предупреждения.

+0

Можете ли вы отформатировать его должным образом. – Sontya

+0

У вас есть две переадресации, если вы создаете «Пользователь», и есть 'Stripe :: CardError' (в разделе' elsif'). – ptd

+0

Согласен с @ptd. Вы должны закончить работу в разделе 'rescue' или изменить порядок' begin ... end' с помощью 'if ... elsif ... else' и использовать 'flash [: alert] ...' только один раз. – PatNowak

ответ

1

Когда Вы спасаете исключение, выполнение кода продолжается оттуда, как обычно, так что ваши redirect_to "/st_buy_now" в вашем rescue блоке плюс redirect_to :controller => 'misc', :action => 'create_1' вы получаете ошибку на ваши два переадресовывает.

Возможно, вы захотите выбросить return в этом блоке rescue.

1

Что об этом, если клиент получил созданный идти дальше и перенаправлять и если ошибка происходит redirect_to «/ st_buy_now»

def st_buy_now_process 
    #create user in system 
    encrypted = BCrypt::Password.create(params[:password]) 
    if (User.where("email = ?", params[:email]).exists?)  
     flash[:alert] = 'User exists. Please try again.'  
     redirect_to "/st_buy_now"   
    elsif (User.create(email: params[:email], encrypted_password: encrypted)) 
     begin 
      customer = Stripe::Customer.create({:description => params[:email],:card => {:number => params[:cc], :exp_month => params[:exp_1],:exp_year => params[:exp_2], :cvc => params[:cvc], :name => params[:name]},:email => params['email'] })    
      p="#{params['plan']}_#{params['billing-cycle']}" 
      subscr = customer.subscriptions.create(:plan => p) 
      user = User.where("email = ?", params[:email]).first 
      user.payg = ({:cus_id => customer.id, :subscr_id => subscr.id}).to_json 
      user.plan = p 
      user.save 
      RestClient.post "https://api:key-nnnn", 
      :from => "<[email protected]>", 
      :to => "#{params[:email]}", 
      :subject => "Welcome to test", 
      :text => "\n\n\n#{File.read("app/views/misc/mail_sign_up.txt")}\n\n\n" 
      cookies['logged_in'] = { 
      :value => '1', 
      } 
      cookies['us_id'] = { 
      :value => params[:email], 
      }  
      flash[:notice] = 'Registration successful.' 
      redirect_to :controller => 'misc', :action => 'create_1' 
     rescue Stripe::CardError => e   
      flash[:alert] = 'Please try again' 
      redirect_to "/st_buy_now" 
     end 
    else 
     flash[:alert] = 'Please try again' 
     redirect_to "/st_buy_now" 
    end 
    end 
+0

Да, это тоже должно работать. – smathy

+0

Спасибо. Я еще не совсем там, но это помогает. Когда я попробую предлагаемый код, я продолжаю получать. Попробуйте еще раз. Это заставило меня задуматься, если я должен оставить пользователя в базе данных, если клиент полосы не создан из-за ошибки. Интересно, что такое лучшая практика, но это другой вопрос. – willcom

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