0

Ruby 2를 사용하여 레일스 4에서 레일스 어플리케이션 중 하나를 다시 작성합니다. 원래 마이클 하트의 Ruby on Rails 튜토리얼 3.2 버전을 사용했습니다. 내 응용 프로그램의 3.2 버전을 새로운 Rails 4 버전으로 복사하고 있습니다. current_user가 제대로 설정되지 않은 것 같습니다. current_user를 사용하는 모든 경로는 레코드가 올바르게 액세스되고 사용자가 로그인되어 있고 로켈이 설정되어 있어도 ID 및 로켈이 누락되어 중단됩니다. current_user를 사용하는 경로가 포함되지 않은 방문 페이지에서 로케일을 변경할 수 있으며 선택한 로케일의 올바른 텍스트와 이미지가 표시됩니다. 유감스럽게도 메인 사이트의 헤더 부분에는 edit_user_path (current_user) 참조가 포함되어 있습니다. 즉, 방문 페이지와 사용자와 관련이없는 웹 사이트의 다른 섹션을 제외하고 내 웹 사이트에 페이지를 표시 할 수 없습니다.레일 4 - 내 current_user 논리가 제대로 작동하지 않습니다 - Michael Hartl Rails 4.0 튜토리얼

다음은 표시 작업을 표시 할 때의 예입니다. current_user를 참조하는 경로에 액세스하려고 할 때마다 비슷한 오류가 발생합니다.

No route matches {:controller=>"users", :action=>"show", :locale=>#<User id: 3, first_name: "first_name", last_name: "last_name", username: "username", email: "[email protected]", password_digest: "$2a$10$y73jlk0hQYKLClmXQI5iHe/fqXO66hJD3muWjDg5ziCD...", city: "MyCity", state_id: 3521, country_id: 233, remember_token: "8cce0e523a879e179dd5b23df04acc8d1cf3108e", password_reset_token: "nU1FbWD2nuXx23jnOmOkAQ", password_reset_sent_at: "2013-10-20 22:36:44", bio: "Here is my bio info...", active_user: "3", age_group: "3", gender: "F", admin: true, visible: true, created_at: "2012-08-28 19:43:27", updated_at: "2013-10-21 22:36:43", state_province: "MyState", broadcaster: true, language_id: 1, admin_localize: false, sos_student: false, send_newsletter: false, special_newsletter: true, temp_broadcaster: false, media_creator_id: 46, bad_email: false, banned: false, notify_resp_me: true, saved_micropost_id: 1, saved_topic_id: 56, saved_discussion_id: 1, notify_reply_me: true, on_profile_page: false, notify_new_disc: true>, :id=>nil, :format=>nil} missing required keys: [:locale, :id] 

current_user가 nil 인 것처럼 보입니다. 나는 내 기억의 논리가 범인이라고 생각한다. 나는 지난 몇 시간 동안 sessions_helper.rb를 보았지만 내가 잘못한 것을 알아낼 수는 없다.

다음은 내 sessions_helper.rb 코드입니다. 참고 : 로그인 (사용자) 방법에서 사용자가 쿠키를 영구 저장할지 아니면 세션에 사용할지 결정할 수 있습니다. 이 자습서에서는 쿠키를 삭제하기 위해 로그 아웃해야하는 영구 쿠키를 사용합니다.

def current_user 
    remember_token = User.encrypt(cookies[:remember_token]) 
    @current_user ||= User.find_by(remember_token: remember_token) 
    end 

    def current_user?(user) 
    user == current_user 
    end 

    def login(user) 
    remember_token = User.new_token 
    if params[:remember_me] 
     cookies.permanent[:remember_token] = remember_token 
    else 
     cookies[:remember_token] = remember_token 
    end 
    user.update_attribute(:remember_token, User.encrypt(remember_token)) 
    self.current_user = user 
    end 

    def logged_in? 
    !current_user.nil? 
    end 

    def logged_in_user 
    unless logged_in? 
     store_location 
     redirect_to login_path, notice: "#{t :must_login}" 
    end 
    end 

    def logout 
    self.current_user = nil 
    cookies.delete(:remember_token) 
    flash[:success] = "#{t :logout}" 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def redirect_back_or(default) 
    redirect_to(session[:return_to] || default) 
    session.delete(:return_to) 
    end 

    def store_location 
    session[:return_to] = request.url if request.get? 
    end 

다음은 내 sessions_controller.rb 로직입니다. 참고 : 사람들이 이메일 주소 나 사용자 이름을 사용하여 로그인 할 수 있도록 허용합니다. 이 논리는 자습서를 기반으로합니다. 그러나 @user로 리디렉션하는 대신 다른 경로를 표시합니다. 그 차이가 최종 결과를 변경하지는 않습니다.

def create 
    user = User.find_by_email(params[:session][:email_user]) 
    if user && user.authenticate(params[:session][:password]) 
     if user.active_user == "1" 
     flash[:error] = "#{t :flash_sessions_error1}" 
     else 
     flash[:success] = "#{t :flash_sessions_success}" 
     login user 
     end 
     redirect_back_or home_path 
    else 
     user = User.find_by_username(params[:session][:email_user]) 
     if user && user.authenticate(params[:session][:password]) 
     if user.active_user == "1" 
      flash[:error] = "#{t :flash_sessions_error1}" 
     else 
      flash[:success] = "#{t :flash_sessions_success}" 
      login user 
     end 
     redirect_back_or home_path 
     else 
     flash.now[:error] = "#{t :flash_sessions_error2}" 
     render "new" 
     end 
    end 
    end 

다음은 user.rb의 코드입니다.

before_create :create_remember_token 

    def User.encrypt(token) 
    Digest::SHA1.hexdigest(token.to_s) 
    end 

    def User.new_token 
    SecureRandom.urlsafe_base64 
    end 

    private 

    def create_remember_token 
     self.remember_token = User.encrypt(User.new_token) 
    end 

다음은 users_controller.rb에서의 나의 쇼 동작입니다. 나는이보고하지만 지금 내가 뭘 잘못 보이지 않아요 계속됩니다

following_user GET /:locale/users/:id/following(.:format)    users#following {:locale=>/en|es|fr|pt/} 
followers_user GET /:locale/users/:id/followers(.:format)    users#followers {:locale=>/en|es|fr|pt/} 
     users GET /:locale/users(.:format)        users#index {:locale=>/en|es|fr|pt/} 
       POST /:locale/users(.:format)        users#create {:locale=>/en|es|fr|pt/} 
     new_user GET /:locale/users/new(.:format)       users#new {:locale=>/en|es|fr|pt/} 
    edit_user GET /:locale/users/:id/edit(.:format)      users#edit {:locale=>/en|es|fr|pt/} 
      user GET /:locale/users/:id(.:format)       users#show {:locale=>/en|es|fr|pt/} 
       PATCH /:locale/users/:id(.:format)       users#update {:locale=>/en|es|fr|pt/} 
       PUT /:locale/users/:id(.:format)       users#update {:locale=>/en|es|fr|pt/} 
       DELETE /:locale/users/:id(.:format)       users#destroy {:locale=>/en|es|fr|pt/} 

:

def show 
    @user = User.find(params[:id]) 
    @microposts = @user.microposts.order("created_at DESC").first(20) 
    @discussions = @user.discussions.order("created_at DESC").first(20) 
    end 

여기에 사용자의 모든 경로에 대한 내 레이크 경로 출력입니다.

도움을 주시면 감사하겠습니다.

+0

'레이크 루트'의 출력을 게시 할 수 있습니까? - user_controllers에'show' 액션이 있습니까? –

+0

사용자에게 레이크 경로를 추가하고 위의 show 액션을 추가했습니다. –

+0

어떤 URL을 사용하고 있습니까? 다음을 입력해야합니다 :'localhost : 3000/: locale/users/: id' - 예. localhost : 3000/en/users/1은 로케일로 영어를 사용하는 사용자 1을 얻습니다. –

답변

1

오늘 아침에 내 기록을 다시 살펴 보았습니다. 나는 논리가 올바른 기록을 얻고 있음을 다시 확인했다. 오류의 끝에서 ID와 로케일이 모두 누락되어 있기 때문에 current_user가 올바르게 설정되지 않았다고 생각했습니다. 올바른 기록이 로그에 있었기 때문에 로케일을 추가하기로 결정했습니다. I18n.locale.to_s이 내 경로 중 하나에 추가되었습니다.

edit_user_path(current_user, locale: I18n.locale.to_s) 

논리에 따라 로캘을 추가 한 후 논리가 작동했습니다. 또 다른 한가지는 내가 그것을 레일 3 코딩 한대로 국제화 코드가 작동

Rails.application.routes.default_url_options[:locale]= I18n.locale 

레일 (4)에서 작동하지 않습니다 레일 3 일 default_url_options에 대한 기본과 관련되었다.나는 로케일 절을 추가하지 않은 링크를 발견했다. 희망이 다른 사람들을 도울 것입니다.

관련 문제