2016-03-26 190 views
0

我在下面的教程:https://www.youtube.com/watch?v=7-1HCWbu7iU 我已經使用devise gem做了Pintrest克隆,並且沒有問題。當我嘗試將current_user添加到鏈接控制器時,我得到「undefined method current_user」。我嘗試了一切...甚至從頭開始重新制作應用程序,定義current_user,重置數據庫。我猜寶石應該自動處理方法,對吧?使用devise gem時獲取current_user undefined方法 - Ruby on Rails 4.1.5

這裏是我的步驟:

1. Generate new app - rails new raddit 
2. Generate scaffold: rails g scaffold link title:string url:string 
3. rake db:migrate 
4. add gem 'devise', '~> 3.3.0' to gem file and run bundle install 
5. run rails g devise:install 
6. add file to development.rb - config.action_mailer.default_url_options = { host: 'localhost', port: 3000 } 
7. add alerts to layout/application.html (as per devise documentation) 
8. generate view file - rails g devise:views 
9. generate user - rails g devise User 
10. rake db:migrate 
11. rails s 
12. go to localhost:3000/users/sign_up (works ok) 
13. Add relation to models: user.rb - has_many :links ; link.rb - belongs_to :user 
14. Create migration: rails generate migration add_user_id_to_links user_id:integer:index 
15. rake db:migrate 
16. go to rails console and save assocation between user and links. 
17. Add current_user to links controller - Getting undefined 'curren_user method' once I go to localhost:3000/links/new 

這裏是我的代碼:

class LinksController < ApplicationController 
    before_action :set_link, only: [:show, :edit, :update, :destroy] 

    def index 
    @links = Link.all 
    end 

    def show 
    end 

    def new 
    @link = Link.current_user.links.build 
    end 

    def edit 
    end 

    def create 
    @link = current_user.build(link_params) 

    respond_to do |format| 
     if @link.save 
     format.html { redirect_to @link, notice: 'Link was  successfully created.' } 
     format.json { render :show, status: :created, location: @link } 
     else 
     format.html { render :new } 
     format.json { render json: @link.errors, status: :unprocessable_entity } 
     end 
    end 
    end 


    def update 
    respond_to do |format| 
     if @link.update(link_params) 
     format.html { redirect_to @link, notice: 'Link was successfully updated.' } 
     format.json { render :show, status: :ok, location: @link } 
     else 
     format.html { render :edit } 
     format.json { render json: @link.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def destroy 
     @link.destroy 
     respond_to do |format| 
     format.html { redirect_to links_url, notice: 'Link was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 

    def set_link 
     @link = Link.find(params[:id]) 
    end 

    def link_params 
     params.require(:link).permit(:title, :url) 
    end 
    end 

我的模型:link.rb

class Link < ActiveRecord::Base 
    belongs_to :user 
end 

我的模型:user.rb

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 
    has_many :links 
end 

回答

3

您正在調用Link.current_user的新操作中獲取未定義的方法'current_user'。

def new 
    @link = Link.current_user.links.build 
end 

應該

def new 
    @link = current_user.links.build 
end 

鏈接沒有CURRENT_USER方法,這就是問題所在。 current_user是在控制器的上下文中定義的,應該像在創建操作中一樣使用。

0

應該

@link = current_user.links.build

在新的動作

,如果您有更多的問題不僅僅是輸入新的行動出口和檢查CURRENT_USER控制檯..你可以從控制檯得到錯誤..所以每次首先檢查你的控制檯。

使用better_errors gem ..有關特定錯誤的更多信息

+0

哦拍!是的,這是問題的根源。我自己修理它沒有意識到大聲笑。但是現在你告訴我什麼修復了它。我應該更加警惕。 –

+0

你應該 – Vishal