AMcoder - javascript, python, java, html, php, sql

Անհատականացրեք authenticate_user սարքը

Ներկայումս ես Ajax-ի զանգ ունեմ կոճակի սեղմման միջոցով, որը թարմացնում է գնումների զամբյուղը, բայց վերահսկիչի վրա, որում այն ​​տեղադրվում է, կիրառվում է authenticate_user! before_filter-ը, ինչը ես ուզում եմ, քանի որ օգտվողը պետք է մուտք գործի:

Քանի որ դա ajax զանգ է, ես սովորաբար ստանում եմ 401 սխալ և ոչ մի վերահղում, այնպես որ դա լուծելու համար ես ունեմ.

$(document).on "ajaxError", (event, request, settings) ->
  if request.status == 401
    window.location.href = '/users/login'

Այնուամենայնիվ, սա ինձ խնդիրներ է առաջացնում, երբ ֆլեշ[:notice]-ը հայտնվի, քանի որ այն կորել է, երբ ես մուտք գործեմ մուտքի էջ:

Այստեղ տարբեր գրառումների վերաբերյալ որոշ ընթերցումներից ես հասկանում եմ, որ կարող եմ օգտագործել flash.keep-ը, որը կպահպանի իմ հաղորդագրությունը, բայց կարծում եմ, որ դա անելու համար ես պետք է փոխեմ իմ մոտեցումը վերահղման հետ կապված: Եթե ​​ես կարողանայի դա անել կարգավորիչում, ես կարող եմ նաև օգտագործել if request.xhr?-ը, չէ՞:

Իմ հարցն այն է, թե ինչպես կավելացնեմ այս ֆունկցիոնալությունը՝ միաժամանակ պահպանելով authenticated_user! օգնական մեթոդի բոլոր առկա գործառույթները: Դիզայներական փաստաթղթերին նայելուց հետո օգնականը դինամիկ կերպով կառուցված է, այնպես չէ՞:

Ես գիտեմ, որ կարող եմ օգնական տեղադրել իմ հավելվածի վերահսկիչի մեջ.

def authenticate_user!
  super
end 

Այսպիսով, ընդլայնելով, ես փորձել եմ

def authenticate_user!
  if request.xhr?
    respond_to do |format|
      format.html { redirect_to new_user_session_path }
    end
  else
    super
  end

Բայց երբ սեղմում եք թարմացման կոճակը, որը սա է

$(window).load ->
  $('a[data-target]').click (e) ->
  e.preventDefault()
  $this = $(this)
  if $this.data('target') == 'Add to'
   url = $this.data('addurl')
   new_target = "Remove from"
  else
    url = $this.data('removeurl')
    new_target = "Add to"
  $.ajax url: url, type: 'put', success: (data) ->
  $('.badge-number').html(data)
  $this.find('span').html(new_target)
  $this.data('target', new_target)

Ես ստանում եմ այս սխալը վահանակում

Routing Error

No route matches [PUT] "/users/login"

Չգիտեմ, թե որտեղից գնալ:


  • ո՞րն է ձեր թարմացման եղանակը վերահսկիչում: 24.12.2015

Պատասխանները:


1

Օգտագործողի տեսանկյունից սա բավականին բարձր է հնչում: Եթե ​​ես սեղմում եմ «ավելացնել զամբյուղին», ես ակնկալում եմ, որ բանը կավելացվի զամբյուղի մեջ: Ես, իհարկե, չեմ ակնկալում, որ ինձ կվերահղեն մուտքի/գրանցման էջ: Այս պահին ես պարզապես կհեռանայի:

Ավելի լավ մոտեցում է, եթե օգտատերը մուտք չի գործել, ստեղծեք հյուր օգտատեր և գրեք դրա ID-ն քուքիների վրա: Հյուր օգտատերն ունի զամբյուղ, կարող է իրեր ավելացնել և այլն:

Այնուհետև վճարման էջում առաջարկում եք «մուտք» / «գրանցվել» ընտրությունը: Երկու դեպքում էլ դուք ստանում եք իրական օգտվող: Այդ պահին դուք տեղափոխում եք հյուրի զամբյուղը և ջնջում հյուր օգտատիրոջը:

Օրինակ:

def current_or_guest_user
  return guest_user unless current_user

  # current user exists. And we found a guest user
  if session[:guest_user_id]
    transfer_guest_user_stuff # cart, posts and what-have-you
    guest_user.destroy
    session[:guest_user_id] = nil
  end
  current_user
end

def guest_user
  unless @cached_guest_user
    @cached_guest_user = User.find_or_create_by(id: session[:guest_user_id], is_guest: true)
    session[:guest_user_id] = @cached_guest_user.id
  end

  @cached_guest_user
end
24.12.2015
  • Շնորհակալություն, դա շատ հիմնավոր կետ է: Ես օգտագործում եմ current_user օգնական մեթոդը զամբյուղը ցուցադրելիս, այնպես որ, կարծում եմ, որ պետք է իրականում ստեղծեմ հյուր օգտատերը, գուցե նախքան գործողության մեջ: Կամ կարո՞ղ եմ նույնը հասնել քուքիների միջոցով, ինչպես դուք նշել եք: 24.12.2015
  • @Richlewis. Պատասխանին ավելացրել է որոշ կոդ: Սա գրեթե հենց այն է, ինչ մենք օգտագործում ենք: 24.12.2015
  • Շնորհակալություն, շատ գնահատված, անհամբեր սպասում եմ այն ​​փորձելուն 24.12.2015
  • guest_user-ը լավ լուծում է, բայց միայն այն դեպքում, երբ մենք պետք է երկար ժամանակ գրանցենք shoping cardը: Մենք պետք է օգտագործենք small_time_living-ը shoping card-ի համար՝ օգտվողների սխալ պատվերներից խուսափելու համար: (Որոշ ժամանակ առաջ օգտատերը ինչ-որ բան դրեց զամբյուղի մեջ, այնուհետև փակեց պատուհանները, գտեք մեկ այլ բան և դրեց այն նաև զամբյուղի մեջ: Օգտվողը սեղմեք pay shoping cart և կտեսնի, թե ինչ-որ մեկին չի ուզում գնել... IMHO, shoping cart չի պահանջվում ուժեղ Անվտանգության կոդը, եթե այս օգտատերը գումար կվճարի սեփական պատվերների համար... 24.12.2015
  • @СергійНазаревич. դա զամբյուղ է, ոչ թե քարտ :) 24.12.2015
  • @ Սերխիո Տուլենցև, այո: Շա՜ 24.12.2015
  • @СергійНазаревич նույնպես մի չարաշահեք հետքայլերը։ Դրանք նախատեսված են ոչ թե պատահական բառերը, այլ ծածկագիրը ընդգծելու համար: 24.12.2015
  • Ներկայումս ես պահում եմ իմ օբյեկտը (գնում եմ զամբյուղի համար) Redis-ում և թարմացնում Ajax-ի միջոցով, ավելի լավ կլինի՞, որ զամբյուղի մոդել ունենամ և այնտեղ պահեմ Redis-ի փոխարեն: Օ, և բոլորին շնորհավոր Սուրբ Ծնունդ :-) 25.12.2015
  • @Richlewis. օգտագործողի զամբյուղը մի բան է, որը ես կցանկանայի պահպանել: Տվյալների բազայում, ոչ թե հիշողության խանութում: :) 25.12.2015
  • @SergioTulentsev այնպես որ, այսօր նայելով սա, և ես զարմանում եմ, թե ինչպես է սահմանվում session[:guest_user_id]-ը: զրոյական է վերադարձնում, երբ ես հետագա ստուգում եմ անում, նաև չեմ կարող օգտատեր ստեղծել, քանի որ վավերացումը ձախողվում է (էլ.փոստի և գաղտնաբառի կարիք ունի), կցանկանայի բաց թողնել validate: false-ի օգտագործումը, բայց թվում է, թե չեմ կարող find_or_create_by որևէ գաղափար ունենալ, կամ ինչ-որ բան չեմ հասկանում :-) 30.12.2015
  • @Richlewis. դուք կարող եք վավերացումները պայմանական դարձնել (բաց թողնված հյուրերի համար): validate_presence_of :email, unless: :guest?, կամ ինչ-որ բան 30.12.2015
  • շնորհակալություն, անհեթեթ հարց, բայց արդյոք այս guest_user-ն արդեն կա տվյալների բազայում, մենք ամեն անգամ նորը չենք ստեղծում: Ես դիտել եմ այս github.com/ plataformatec/devise/wiki/ նույնպես 30.12.2015
  • Մենք ամեն անգամ նորը չենք ստեղծում, հետևաբար՝ գտնել _or_create_by 30.12.2015
  • լավ, ինչպե՞ս է այն գտնում id: session[:guest_user_id], -ի հետ, երբ այն գոյություն չունի (եթե ես առաջին անգամ եմ մուտք գործում կայք), քանի որ սկզբում դա միշտ զրոյական է: 30.12.2015
  • Կարծում եմ, որ ես գուցե ստիպված լինեմ ձեզ հետ նստաշրջան պատվիրել codementor-ով 30.12.2015
  • @Richlewis. եթե այն գոյություն չունի, ուրեմն ստեղծվում է։ Find_or_create_by-ն այսպես է աշխատում: գտնել այս պարամետրերով կամ ստեղծել այս պարամետրերով: Դուք ծանոթ չեք մեթոդին: 30.12.2015
  • @Richlewis․ այո, կոդավորիչը հիանալի է այս կարգի հարցերը մաքրելու համար, քանի որ կապի շատ ավելի մեծ թողունակություն կա։ 30.12.2015
  • այո, ծանոթ է մեթոդին, և այո, դժվար է միավորներ ստանալ մեկնաբանությունների միջոցով: Իմ հասկացողությունը ընկնում է այն կետում, երբ, եթե այս պարամետրերը գոյություն չունեն, սահմանեք id-ը որպես session[:guest_user_id], բայց որտեղից է դա գալիս, քանի որ առաջին անգամ այն ​​գոյություն չի ունենա… 30.12.2015

  • 2

    Որպես առաջին խորհուրդ՝ Դուք կարող եք օգտագործել Trubolinks gem, որն ապահովում է AJAX-ի բոլոր գործառույթները: «in-box» և կանխադրված է Rails 4+-ում:

    Որպես երկրորդ խորհուրդ՝ Դուք կարող եք ստեղծել Users Controler ( rails generate devise:controllers Users) և/կամ մշակել մոդուլներ, ինչպիսիք են նիստերը: գաղտնաբառերը և այլ կարգավորիչներ Անհատականացնել Devise-ով Գործիքներ:

    Բացի այդ, Դուք կարող եք հարմարեցնել before_filter-ը որոշակի Վերահսկիչի կոդում, օրինակ՝

    class TicketsController < ApplicationController
      before_filter :store_location
      before_filter :authenticate_user!, :only => [:new, :delete]
    

    Այս նմուշում :authenticate_user-ը պետք է լինի միայն :new և :delete մեթոդների համար: Այլ մեթոդները չեն պահանջում օգտվողների նույնականացում ...

    Հուսով եմ, որ դա կօգնի ձեզ:

    24.12.2015
  • Եթե ​​նա անջատի authenticate_user-ը զամբյուղի թարմացման համար, ո՞ր օգտատիրոջ զամբյուղը կգնա ապրանքը: 24.12.2015
  • Where live shoping cart? Այն ապրում է նիստերում որպես shoping cart օբյեկտի օրինակ: Մինչ օգտատերը չի փակում պատուհանը, ընդունելի կլիներ օգտագործել... 24.12.2015
  • Պարտադիր չէ, որ. Այն կարող է նաև գնալ տվյալների բազա: 24.12.2015
  • այո Ես գրել եմ մեկ այլ մեկնաբանությունում, եթե մենք պետք է այն գրենք տվյալների բազայում, guast_user լուծումը լավագույնն է: :) 24.12.2015
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..