Ruby on rails 在\u筛选器之前:验证\u用户!,除了:[:索引]/Rails 4

Ruby on rails 在\u筛选器之前:验证\u用户!,除了:[:索引]/Rails 4,ruby-on-rails,authentication,devise,ruby-on-rails-4,Ruby On Rails,Authentication,Devise,Ruby On Rails 4,我有一个Listings控制器(设计用户系统),在Rails 3中我刚刚使用了它 before_filter :authenticate_user!, except: [:index] 查看特定列表前检查用户是否已登录 我的主页(索引)在底部显示了一个视图列表,用户可以看到它们,但只要他点击一个来查看它,他就会被重定向到登录页面 这就是为什么在我的控制器里 Listing.new -> current_user.listings.new 在Rails 4中,事情似乎发生了变化,我找不到

我有一个
Listings控制器
(设计用户系统),在Rails 3中我刚刚使用了它

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
class ListingsController[:索引]
#获取/列表
#GET/listings.json
def索引
@listings=Listing.order(“在desc创建”)
结束
#获取/listings/1
#GET/listings/1.json
def秀
结束
#获取/列表/新建
def新
@listing=当前_user.listings.build
结束
#获取/列表/1/编辑
定义编辑
结束
#张贴/列表
#POST/listings.json
def创建
@listing=当前用户.listings.build(列表参数)
回应待办事项|格式|
if@listing.save
format.html{将_重定向到@listing,注意:“listing已成功创建”。}
format.json{呈现操作:“显示”,状态::已创建,位置:@listing}
其他的
format.html{呈现操作:'new'}
format.json{render json:@listing.errors,status::unprocessable_entity}
结束
结束
结束
#补丁/PUT/listings/1
#PATCH/PUT/listings/1.json
def更新
回应待办事项|格式|
if@listing.update(列表参数)
format.html{将_重定向到@listing,注意:'列表已成功更新。}
format.json{head:no_content}
其他的
format.html{呈现操作:“编辑”}
format.json{render json:@listing.errors,status::unprocessable_entity}
结束
结束
结束
#删除/列表/1
#删除/listings/1.json
def销毁
@listing.destroy
回应待办事项|格式|
format.html{redirect_to listings_url}
format.json{head:no_content}
结束
结束
私有的
#使用回调在操作之间共享公共设置或约束。
def set_列表
@listing=当前用户.listings.find(参数[:id])
结束
#永远不要相信来自恐怖网络的参数,只允许白名单通过。
def列表参数
参数require(:listing).permit(:title,:description,:image)
结束
结束
编辑:问题2

如果另一个登录用户试图查看另一个用户创建的列表,我将收到此->

日志呢


设置列表
之前调用
验证用户
,以便
当前用户
不是
nil

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

尝试此操作,这将允许来宾查看参数中提供的列表:

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

您似乎希望按参数显示列表,而不是按当前用户显示列表。如果是,请更新您的
set\u列表
定义如下:

def set_listing
    @listing = Listing.find(params[:id]) if params[:id]
end
对 您需要在
设置列表
之前调用
验证用户
,以便
当前用户
不是
nil

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

像这样

在\u过滤器之前:验证\u用户!,除了:[:索引]

当我们想在用户未登录时将用户重定向到特定页面时,可以使用此选项


在这个
”中,除了[:index]“
其中的索引是
Html
视图的pagename,您想重定向用户。

您可能想在
设置列表之前对用户进行
身份验证
您的意思是将身份验证用户移到设置列表行上方吗?刚才,我工作了。。你介意把答案贴出来让我投票吗?:)哦,但现在如果用户想查看其他用户的列表->ListingsController中的NoMethodError,请为nil显示未定义的方法“listings”:NilClass
before\u action
是before\u filter
的别名,在Neo的帮助下,我正确执行before操作。但现在,如果我登录到另一个帐户,并尝试查看一个不是由我创建的列表,我将得到“ListingsController中的NoMethodError#为nil:NilClass显示未定义的方法'listings'。使用您的代码:(@TheMiniJohn,你能从你的日志中发布跟踪信息吗。哦,那是因为列表不属于当前用户。既然你正在传递列表,为什么不直接通过
id
查找列表呢。更合适的方法是,一旦用户通过身份验证,你的
index
页面只显示登录用户的列表,这样你就可以不要遇到这样的错误。用户现在可以查看其他用户的列表,但也可以编辑它们:(@TheMiniJohn,在您的
show.html.erb
上,您现在想检查列表是否属于当前用户,如果它确实显示编辑链接,则不显示编辑链接。例如,
此答案与我的答案有何不同?