2013-07-28 5 views
19

Ich habe eine Listings Controller (User System Entwickeln) und in Rails 3 ibefore_filter: authenticate_user !, außer: [: index]/Rails 4

before_filter :authenticate_user!, except: [:index] 

nur verwendet um zu überprüfen, ob ein Benutzer angemeldet wurde bevor Sie einen bestimmten Eintrag anzeigen.

Meine Homepage (Index) zeigt am unteren Rand eine Liste an, die der Benutzer sehen kann, aber sobald er auf einen klickt, um ihn anzuzeigen, wird er auf die Anmeldeseite umgeleitet.

Das ist, warum in meinem Controller i statt

hatte scheint
Listing.new -> current_user.listings.new 

In Rails 4 Dinge geändert zu haben und ich kann nicht den richtigen Weg, es zu tun.

Ich suchte ein wenig und fand, dass der Befehl zu

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

Ein Gast kann den Index jetzt ansehen geändert wurde, aber wenn er auf einen Eintrag klickt, wird er nicht auf die Anmeldeseite umgeleitet, statt i Erhalte diesen Fehler.

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. 

Meine Anzeigen-Controller

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 

EDIT: PROBLEM 2

Wenn eine andere angemeldete Benutzer versucht, einen Eintrag anzuzeigen, die ein anderer Nutzer im erstellt bekommen diese ->

enter image description here

und das Protokoll

enter image description here

+2

U wünschen konn tun 'authenticate_user' vor' set_listing' – Santhosh

+0

Sie meinen, bewegen Sie einfach den authenticate_user über die set_listing Zeile? –

+0

ja. hast du das versucht? – Santhosh

Antwort

7

die Sie interessieren, dies erlaubt es den Gästen zu sehen, in dem Parameter angegeben Liste:

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

Aktualisierung:

Es scheint, dass Sie Auflistungen nach Parameter und nicht nach current_user anzeigen möchten.Wenn ja, dann geben Sie bitte Ihre set_listing Definition wie folgt aktualisieren:

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

Ich habe die vor Aktion richtig, mit der Hilfe von Neo. Aber jetzt, wenn ich in einem anderen Konto eingeloggt bin und versuche, einen Eintrag anzuzeigen, der nicht von mir erstellt wurde, bekomme ich "NoMethodError in ListingsController # show undefined Methode' Listings 'für nil: NilClass ". Mit Ihrem Code auch :( –

+0

@TheMiniJohn, können Sie die Spur aus Ihrem Protokoll zu posten. – vee

+0

ich bearbeitet die Frage. –

25

Anruf authenticate_user vor set_listing, so dass current_user nicht ist nil

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

Arbeitete, danke :) –

-3

ja Sie müssen authenticate_user vor set_listing nennen, so dass current_user nicht nil

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

wie diese

+0

Wie unterscheidet sich diese Antwort von mir? – Santhosh

Verwandte Themen