2012-05-23 21 views
5

Tôi muốn thực hiện xác thực với Ruby on Rails, rằng mọi người dùng đều có tài khoản riêng của họ. Nhưng bây giờ tôi đã gặp lỗi này:phương thức chưa xác định `user_signed_in? ' cho # <ProjectsController: 0x007faead1853e0>

undefined method user_signed_in? for #<ProjectsController:0x007faead1853e0> 

Ai đó có thể giúp tôi?

Đây là mã:

Full dấu vết:

app/controllers/projects_controller.rb:69:in `require_login' 
activesupport (3.2.3) lib/active_support/callbacks.rb:418:in `_run__2505248868868045404__process_action__114470166732456289__callbacks' 
activesupport (3.2.3) lib/active_support/callbacks.rb:405:in `__run_callback' 
activesupport (3.2.3) lib/active_support/callbacks.rb:385:in `_run_process_action_callbacks' 
activesupport (3.2.3) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.2.3) lib/abstract_controller/callbacks.rb:17:in `process_action' 
actionpack (3.2.3) lib/action_controller/metal/rescue.rb:29:in `process_action' 
actionpack (3.2.3) lib/action_controller/metal/instrumentation.rb:30:in `block in process_action' 
activesupport (3.2.3) lib/active_support/notifications.rb:123:in `block in instrument' 
activesupport (3.2.3) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
activesupport (3.2.3) lib/active_support/notifications.rb:123:in `instrument' 
actionpack (3.2.3) lib/action_controller/metal/instrumentation.rb:29:in `process_action' 
actionpack (3.2.3) lib/action_controller/metal/params_wrapper.rb:205:in `process_action' 
activerecord (3.2.3) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (3.2.3) lib/abstract_controller/base.rb:121:in `process' 
actionpack (3.2.3) lib/abstract_controller/rendering.rb:45:in `process' 
actionpack (3.2.3) lib/action_controller/metal.rb:203:in `dispatch' 
actionpack (3.2.3) lib/action_controller/metal/rack_delegation.rb:14:in `dispatch' 
actionpack (3.2.3) lib/action_controller/metal.rb:246:in `block in action' 
actionpack (3.2.3) lib/action_dispatch/routing/route_set.rb:73:in `call' 
actionpack (3.2.3) lib/action_dispatch/routing/route_set.rb:73:in `dispatch' 
actionpack (3.2.3) lib/action_dispatch/routing/route_set.rb:36:in `call' 
journey (1.0.3) lib/journey/router.rb:68:in `block in call' 
journey (1.0.3) lib/journey/router.rb:56:in `each' 
journey (1.0.3) lib/journey/router.rb:56:in `call' 
actionpack (3.2.3) lib/action_dispatch/routing/route_set.rb:600:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/best_standards_support.rb:17:in `call' 
rack (1.4.1) lib/rack/etag.rb:23:in `call' 
rack (1.4.1) lib/rack/conditionalget.rb:25:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/head.rb:14:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/params_parser.rb:21:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/flash.rb:242:in `call' 
rack (1.4.1) lib/rack/session/abstract/id.rb:205:in `context' 
rack (1.4.1) lib/rack/session/abstract/id.rb:200:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/cookies.rb:338:in `call' 
activerecord (3.2.3) lib/active_record/query_cache.rb:64:in `call' 
activerecord (3.2.3) lib/active_record/connection_adapters/abstract/connection_pool.rb:467:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/callbacks.rb:28:in `block in call' 
activesupport (3.2.3) lib/active_support/callbacks.rb:405:in `_run__4031929640367205598__call__2058268190974805736__callbacks' 
activesupport (3.2.3) lib/active_support/callbacks.rb:405:in `__run_callback' 
activesupport (3.2.3) lib/active_support/callbacks.rb:385:in `_run_call_callbacks' 
activesupport (3.2.3) lib/active_support/callbacks.rb:81:in `run_callbacks' 
actionpack (3.2.3) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/reloader.rb:65:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/remote_ip.rb:31:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/debug_exceptions.rb:16:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/show_exceptions.rb:56:in `call' 
railties (3.2.3) lib/rails/rack/logger.rb:26:in `call_app' 
railties (3.2.3) lib/rails/rack/logger.rb:16:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/request_id.rb:22:in `call' 
rack (1.4.1) lib/rack/methodoverride.rb:21:in `call' 
rack (1.4.1) lib/rack/runtime.rb:17:in `call' 
activesupport (3.2.3) lib/active_support/cache/strategy/local_cache.rb:72:in `call' 
rack (1.4.1) lib/rack/lock.rb:15:in `call' 
actionpack (3.2.3) lib/action_dispatch/middleware/static.rb:62:in `call' 
railties (3.2.3) lib/rails/engine.rb:479:in `call' 
railties (3.2.3) lib/rails/application.rb:220:in `call' 
rack (1.4.1) lib/rack/content_length.rb:14:in `call' 
railties (3.2.3) lib/rails/rack/log_tailer.rb:14:in `call' 
rack (1.4.1) lib/rack/handler/webrick.rb:59:in `service' 
/Users/sinaoberle/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:138:in `service' 
/Users/sinaoberle/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/webrick/httpserver.rb:94:in `run' 
/Users/sinaoberle/.rbenv/versions/1.9.3-p0/lib/ruby/1.9.1/webrick/server.rb:191:in `block in start_thread' 

projects_controller.rb

class ProjectsController < ApplicationController 
    before_filter :require_login 
    # GET /projects 
    # GET /projects.json 
    def index 
    @projects = current_user.projects 

    end 

    # GET /projects/1 
    # GET /projects/1.json 
    def show 
    @projects = current_user.projects.find(params[:id]) 

    end 

    # GET /projects/new 
    # GET /projects/new.json 
    def new 
    @projects = current_user.projects.build 

    end 

    # GET /projects/1/edit 
    def show 
    @projects = current_user.projects.find(params[:id]) 

    end 

    # POST /projects 
    # POST /projects.json 
    def create 
    @projects = current_user.projects.build(params[:mytime]) 
     if @projects.save 
     redirect_to projects_path, 
      notice: 'Created successfully!' 
     else 
     render 'new' 
     end 
    end 

    # PUT /projects/1 
    # PUT /projects/1.json 
    def update 
    @projects = current_user.projects.find(params[:id]) 
     if @projects.update_attributes(params[:mytime]) 
     redirect_to projects_path, 
      notice: 'Changed successfully!' 
     else 
     render 'edit' 

    end 
end 

    # DELETE /projects/1 
    # DELETE /projects/1.json 
    def destroy 
    @projects = current_user.projects.find(params[:id]) 
    @projects.destroy 
    redirect_to projects_url, 
     notice: 'Deleted successfully!' 

    end 
end 

private 

def require_login 
    unless user_signed_in? 
    redirect_to login_path, 
    alert: "Please, Sign In first!" 
end 
end 

application.html.erb

<!DOCTYPE html> 
<html> 
<head> 
    <title>Test</title> 
    <%= stylesheet_link_tag "application", :media => "all" %> 
    <%= javascript_include_tag "application" %> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 


    <%= csrf_meta_tags %> 
</head> 
<body> 
<div id="container"> 

    <div id="content"> 
     <% if flash[:notice] %> 
     <p id="notice"> 
      <%= flash[:notice] %> 
     </p> 
     <% end %> 

     <% if flash[:alert] %> 
     <p id= "alert"> 
      <%= flash[:alert] %> 
     </p> 
     <% end %> 
    </div> 
    <div id="footer"> 
    <%= link_to "Sign In", new_user_path %> | 
     <% if user_signed_in? %> 
     <%= link_to "Logout", logout_path, method: :delete %> | 
     <%= link_to "Test", projects_path %> 
     <% else %> 
     <%= link_to "Login", login_path %> 
     <% end %> 
     <%= yield %> 
    </div> 
</div> 
</body> 
</html> 

routes.rb

Dự án :: Application.routes.draw làm

get "pages/home" 

    resources :projects 
    resources :users, :only => [:new, :create] 
    resources :sessions, :only => [:create] 

    get "login" => "sessions#new", as: "login" 
    post "sessions" => "sessions#create", as: "sessions" 
    delete "logout" => "sessions#destroy", as: "logout" 

    root to: 'pages#home' 

Trả lời

8

Bạn đang sử dụng đưa ra để xác thực? tôi đã không sử dụng nó bản thân mình, nhưng bằng cách nhìn vào devise codedocumentation có vẻ như bạn nên làm before_filter :authenticate_user! trong bộ điều khiển (hoặc một số lớp điều khiển cha mẹ) nơi bạn muốn sử dụng những người trợ giúp như user_signed_in?.

+0

@UserS vì vậy đây là vấn đề thực tế? –

0

Hãy chắc chắn rằng bạn cài đặt xác thực gem gem. Phương thức 'user_signed_in? 'không được tích hợp trong đường ray3.

Xem Devise: NoMethod Error & user_signed_in

+0

Tôi nên sử dụng lệnh nào? Tôi đặt nó vào file gem của tôi: gem 'devise', '2.1.0.rc2' – UserS

+0

gem install devise? – UserS

+0

tôi đã thử nó. Nhưng nó không hoạt động. – UserS

1

Làm thế nào mà bạn tạo ra mô hình devise của bạn?

Trong trường hợp của tôi, tôi đã tạo theo cách khác. Nếu bạn tạo ra nó như thế này:

rails g devise User/Person 

Sau đó, bạn sẽ có thể sử dụng điều này trong điều khiển của bạn để đảm bảo người dùng được signed_in trước khi xem trang:

Thông báo Tôi đang sử dụng người thay vì sử dụng

before_action :authenticate_person! 

Để kiểm tra xem họ đang đăng nhập, làm như vậy:

<% if person_signed_in? %> 
     <p>You are signed in</p> 
    <% else %> 
     <p>Aww you are not signed in!</p> 
    <% end %> 

Bí quyết là hiểu rằng những người trợ giúp đó được tạo tự động dựa trên cách bạn tạo mô hình Devise của mình ban đầu.

Nó là tài liệu trên github lập mưu của:

Notice that if your Devise model is called Member instead of User, for example, then the helpers available are:

before_action :authenticate_member! 

member_signed_in? 

current_member 

member_session 

https://github.com/plataformatec/devise

LƯU Ý:

:authenticate_user_person như một tôi tạo ra không làm việc, tôi không biết là tại sao nó chọn cuối cùng chỉ một phần. Nếu bạn không chắc chắn, thường thì trang lỗi sẽ hiển thị cho bạn:

"Ý của bạn là # your_devise_model_name_here #?"

enter image description here

Các vấn đề liên quan