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