2013-07-28 3 views
19

У меня есть Listings Controller (Разработайте систему пользователя) и в Rails 3 я просто использовалbefore_filter: authenticate_user !, за исключением: [: индекс]/Rails 4

before_filter :authenticate_user!, except: [:index] 

, чтобы проверить, если пользователь был подписан в перед просмотром определенного списка.

Моя домашняя страница (указатель) показывает внизу вид Объявления, пользователь может их видеть, но как только он нажмет на него, чтобы просмотреть его, он перенаправляется на страницу входа.

Вот почему в моем контроллере я имел вместо

Listing.new -> current_user.listings.new 

В Rails 4 вещи, кажется, изменилось, и я не могу найти правильный способ сделать это.

Я искал немного, и обнаружили, что команда была изменена на

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

гость может посмотреть теперь индекс, но если он нажмет на листинг, он не был перенаправлен на страницу входа в систему, а не я получите эту ошибку.

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. 

Мои объекты Контроллер

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: ПРОБЛЕМА 2

Если другой Помнить пользователь пытается просмотреть список которых другой пользователь, созданный им получать это ->

enter image description here

и журнал

enter image description here

+2

U может захотеть do 'authenticate_user' перед' set_listing' – Santhosh

+0

Вы имеете в виду просто переместить authenticate_user над линией set_listing? –

+0

есть. Вы это пробовали? – Santhosh

ответ

7

Попробуйте, это позволит гостям увидеть листинг поставляется в параметре:

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

Обновление:

Похоже, что вы хотите отображать списки по параметрам, а не по current_user.Если да, то пожалуйста, обновите set_listing определение следующим образом:

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

Я получил правильное действие, используя Neo. Но теперь, если я зарегистрирован в другой учетной записи и попытаюсь просмотреть листинг, который не создан из меня, я получу «NoMethodError в ListingsController # show undefined method« listings »для nil: NilClass». С вашим кодом также :( –

+0

@TheMiniJohn, можете ли вы опубликовать трассировку из своего журнала. – vee

+0

я отредактировал вопрос. –

25

Вызов authenticate_user перед тем set_listing, так что current_user не nil

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

Работал, спасибо :) –

-3

да Вам нужно позвонить authenticate_user перед тем set_listing, так что current_user не nil

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

как этот

+0

Как этот ответ отличается от моего? – Santhosh

Смежные вопросы