簡體   English   中英

Rails中nil的未定義方法角色

[英]undefined method role for nil in rails

我是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

任何建議將不勝感激!

唯一可能引發此錯誤的行是

   <% if @user.role == "admin" %>

因此, @usernil 這意味着current_user必須為nil 找出為什么未設置current_user原因,或者,如果未設置current_user有效,請將您對@user的訪問權@user在某些條件邏輯中。

簡便的解決方法是在檢查角色之前檢查用戶是否存在:

<% if ( @user.present? && @user.role == "admin" ) %>

如果未定義@user,則它將返回false,並且在第二部分不會失敗。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM