2013-11-21 85 views
0

我的目標是僅向創建列表的用戶顯示「編輯」和「刪除」按鈕。但是,由於某種原因,current_user返回nil。任何想法爲什麼發生這種情況?設計:current_user ==零?

這裏是我的用戶模型:

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

這裏是我的上市型號:

class Listing < ActiveRecord::Base 
    belongs_to :user 
    has_many :thoughts 
end 

<% @listings.each do |listing| %> 
     <tr> 
     <td><%= listing.title %></td> 
     <td><%= listing.school %></td> 
     <td><%= listing.price %></td> 
     <td><%= listing.description %></td> 
     <% if current_user == listing.user %> 
     <td><%= link_to 'Show', listing %></td> 
     <td><%= link_to 'Edit', edit_listing_path(listing) %></td> 
     <td><%= link_to 'Delete', listing, method: :delete, data: { confirm: 'Are you sure?' } %></td> 
     <% else %> 
     <td><%= link_to 'Show', listing %></td> 
     <% end %> 
     </tr> 
    <% end %> 

這裏是上市控制器創建操作

def create 
    @listing = Listing.new(listing_params) 

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

這裏是我的create_listings遷移

class CreateListings < ActiveRecord::Migration 
    def change 
    create_table :listings do |t| 
     t.string :title 
     t.string :school 
     t.integer :price 
     t.text :description 

     t.timestamps 
    end 
    end 
end 
+0

當任何用戶登錄時'current_user'爲'nil' ...您確定用戶始終登錄該地點嗎? – zeroed

+0

你是否說當用戶登錄時'current_user'是**假設**爲零?如果是這種情況,我必須發出什麼命令才能解決當前登錄的用戶?不知道你在問我什麼。 @zeroed –

+0

如果你要做很多這個,而你還沒有使用它,你可能想在這個應用程序中使用'cancan' ... https://github.com/ryanb/cancan – CDub

回答

5

確保你有你的控制器before_filter :authenticate_user!集:

class ListingsController < ActionController::base 
    before_filter :authenticate_user! 

    def index 
    @listings = Listing.all 
    end 
end 

至於你的創造方法,只要表中有你只需要一個user_id列爲該列表設置用戶:

def create 
    @listing = Listing.new(listing_params) 
    @listing.user = current_user 

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

最後,對於屬於用戶的列表,它需要能夠記錄該用戶的ID。確保你的表有一個user_id列:

class CreateListings < ActiveRecord::Migration 
    def change 
    create_table :listings do |t| 
     t.string :title 
     t.string :school 
     t.integer :price 
     t.text :description 
     t.integer :user_id 

     t.timestamps 
    end 
    end 
end 

您可以重新運行此遷移,如果它是你最新從控制檯呼叫rake db:migrate:redo。 如果不是最新的,您需要針對該遷移ID(請參閱此處的步驟:4.3 Running Specific Migrations)專門與VERSION=xxx一起運行。這將使桌子空了。 如果您需要在該表中保留日期,那麼您只需使用命令add_column :listings, :user_id, :integer來編寫新的遷移。

+0

哪個控制器? –

+0

@DylanRichards任何方法的控制器觸發你發佈的視圖代碼(可能是'listings_controller.rb')。如果您沒有在控制器鏈中驗證用戶身份,那麼'current_user'變量將永遠不會被設置。 – Matt

+0

我可以將它放在ApplicationController中嗎?我對rails非常陌生,我不確定它屬於哪個控制器。此外,我應該將before過濾器放在類中嗎?或者外面? –

0

我會做這樣的事情signed_in? && current_user.id == listing.user_id

+0

我會給這個鏡頭。 –

+0

另外,馬特是對的;你應該在控制器中包含before_filter。 –

+0

我收到一個錯誤:未定義的方法'user_id' –