我是rails的新手,我刚在我的应用程序中设置了一个博客。
我希望我的客人能够查看/查看博客,但无法进行任何更改。更改编辑/更新功能仅适用于管理员。
我目前已经安装了cancancan和devise,它们运行良好。
我的vblogs / index.html.erb文件目前看起来像这样:
<% @vblogs.each do |vblog| %>
<h2><%= vblog.title %></h2>
<hr>
<br>
<p><b>Created By:<%= vblog.author %></b></p>
<br>
<p><b>Posted On:<%= vblog.posted_on %></b></p>
<br>
<p><%= vblog.post %></p>
<br>
<br>
<%= link_to 'View', vblog %>
<% if @user.role == "admin" %>
<%= link_to 'Change/Update', edit_vblog_path(vblog) %> |
<%= link_to 'Delete', vblog, method: :delete, data: { confirm: 'Are you sure?' } %>
<br>
<%= link_to 'Create A New Blog Post', new_vblog_path %>
和我的vblogs_controller.rb文件如下所示:
class VblogsController < ApplicationController
before_action :set_vblog, only: [:show, :edit, :update, :destroy]
# GET /vblogs
# GET /vblogs.json
def index
@vblogs = Vblog.all
@user = current_user
end
# GET /vblogs/1
# GET /vblogs/1.json
def show
@user= User.all
end
# GET /vblogs/new
def new
@vblog = Vblog.new
end
# GET /vblogs/1/edit
def edit
if !current_user.admin?
redirect_to vblogs_path
return
end
@users =User.all
end
# POST /vblogs
# POST /vblogs.json
def create
@vblog = Vblog.new(vblog_params)
respond_to do |format|
if @vblog.save
format.html { redirect_to @vblog, notice: 'Vblog was successfully created.' }
format.json { render action: 'show', status: :created, location: @vblog }
else
format.html { render action: 'new' }
format.json { render json: @vblog.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /vblogs/1
# PATCH/PUT /vblogs/1.json
def update
respond_to do |format|
if @vblog.update(vblog_params)
format.html { redirect_to @vblog, notice: 'Vblog was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @vblog.errors, status: :unprocessable_entity }
end
end
end
# DELETE /vblogs/1
# DELETE /vblogs/1.json
def destroy
@vblog.destroy
respond_to do |format|
format.html { redirect_to vblogs_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_vblog
@vblog = Vblog.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def vblog_params
params.require(:vblog).permit(:title, :author, :posted_on, :post)
end
end
任何建议都将不胜感激!
答案 0 :(得分:5)
唯一可能引发此错误的行是
<% if @user.role == "admin" %>
所以,@user
是nil
。这意味着current_user
必须是nil
。找出未设置current_user
的原因,或者,如果它未设置有效,请将@user
的访问权限包含在某些条件逻辑中。
答案 1 :(得分:1)
简单的解决方法是在检查角色之前检查用户是否在场:
<% if ( @user.present? && @user.role == "admin" ) %>
如果未定义@user,则它将返回false而不会在第二部分失败。