2013-07-28 19 views
19

4 Bir kullanıcı oturum eğer ben sadecebefore_filter: hariç authenticate_user !,: [: endeksi]/Raylar

before_filter :authenticate_user!, except: [:index] 

kullanılan 3 bir Listings Controller (Kullanıcı Sistemini Vasiyetle) ve yılında Raylar kontrol etmek var belirli bir listeyi görüntülemeden önce.

Ana Sayfam (İndeks) bir alttan bir görünümü gösterir Listeler, Kullanıcı bunları görebilir, ancak görebilmek için bir tanesini tıklatır tıklatırsa, Giriş Sayfasına yeniden yönlendirilir. benim denetleyicisi i Raylar 4 şey ise

Listing.new -> current_user.listings.new 

yerine vardı yüzden

değişmiş gibi görünüyor ve ben bunu yapmanın doğru yolunu bulamıyorum.

ben biraz arandı ve komut şimdi Index görüntüleyebilirsiniz

before_action :authenticate_user!, :except => [:index] 

A Misafir olarak değiştirildi ettiğini fakat bir Listesinde tıklarsa, o giriş sayfasına yönlendirildi yerine ben değil bu hatayı al.

NoMethodError in ListingsController#show 
undefined method `listings' for nil:NilClass 

# Use callbacks to share common setup or constraints between actions. 
def set_listing 
     @listing = current_user.listings.find(params[:id]) 
end 

# Never trust parameters from the scary internet, only allow the white list through. 

Benim Listeleri Kontrol

class ListingsController < ApplicationController 
    before_action :set_listing, only: [:show, :edit, :update, :destroy] 
    before_action :authenticate_user!, :except => [:index] 

    # GET /listings 
    # GET /listings.json 
    def index 
    @listings = Listing.order("created_at desc") 
    end 

    # GET /listings/1 
    # GET /listings/1.json 
    def show 
    end 

    # GET /listings/new 
    def new 
     @listing = current_user.listings.build 
    end 

    # GET /listings/1/edit 
    def edit 
    end 

    # POST /listings 
    # POST /listings.json 
    def create 
     @listing = current_user.listings.build(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 

    # PATCH/PUT /listings/1 
    # PATCH/PUT /listings/1.json 
    def update 
    respond_to do |format| 
     if @listing.update(listing_params) 
     format.html { redirect_to @listing, notice: 'Listing was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @listing.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /listings/1 
    # DELETE /listings/1.json 
    def destroy 
    @listing.destroy 
    respond_to do |format| 
     format.html { redirect_to listings_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_listing 
      @listing = current_user.listings.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def listing_params 
     params.require(:listing).permit(:title, :description, :image) 
    end 
end 

DÜZENLEME: SORUN 2

Kullanıcı Giriş yapılan başka başka kullanıcı im oluşturulan bir liste görüntülemeye çalışırsa alma bu ->

enter image description here

ve set_listing önce günlük

enter image description here

+2

gibi nil

before_action :authenticate_user!, :except => [:index] before_action :set_listing, only: [:show, :edit, :update, :destroy] 

değil current_user böylece, set_listing önce authenticate_user çağırmanız gerekir set_listing'tan önce 'authenticate_user' yapmak – Santhosh

+0

Yani, authenticate_user öğesini set_listing satırının üzerine mi taşımak istiyorsunuz? –

+0

evet. Bunu denedin mi? – Santhosh

cevap

7

, bu misafirler parametrede verilen listeleme görmek sağlayacak bu deneyin değil current_user böylece:

def set_listing 
    unless current_user 
     @listing = Listing.find(params[:id]) 
    else 
     @listing = current_user.listings.find(params[:id]) 
    end 
end 

Güncelleştirme:

current_user tarafından değil, listelere göre girişleri görüntülemek istediğiniz anlaşılıyor.böylece daha sonra set_listing tanımını güncellemek lütfen aşağıdaki gibidir: evet

def set_listing 
    @listing = Listing.find(params[:id]) if params[:id] 
end 
+0

Ben eylemden önce hakkı var, Neo yardımıyla. Ama şimdi, başka bir hesapta oturum açtıysanız ve benden oluşturulmayan bir listeyi görüntülemeye çalışırsanız, "NoingshodError, ListingsController # show undefined method" nil: NilClass "listelerini" gösterir. kodunuzu da –

+0

@TheMiniJohn :(ile, günlüğünden iz gönderebilir. – vee

+0

i Soru düzenlenebilir. –

25

Çağrı authenticate_user, nil

before_action :authenticate_user!, :except => [:index] 
before_action :set_listing, only: [:show, :edit, :update, :destroy] 
+0

çalıştı, teşekkür ederim :) –

-3

U isteyebilirsiniz bu

+0

Bu cevap benimkilerden nasıl farklı? – Santhosh

İlgili konular