2016-04-01 10 views
0

私は自分のアプリケーションを構築することを望んで、Web開発を新しくしました(私は約6/7ヶ月前からコーディングしています)。私はMichael HartlのRuby on Railsチュートリアルを読んで作業しています。私は第9章のセクションのユーザを削除しています。すべてが、ユーザーリンク以外のほとんどの部分で機能します。表示ページには表示されません。ユーザーとそのアバターがうまくいきます。私はちょうどユーザーが表示するリンクを削除する方法を見つけることができません。以下は、ユーザーモデル、ユーザーコントローラ、現在のコードが存在するコードのセッションコントローラ、およびビューのコードです。ユーザーのためのリンクを削除していません

また、ユーザーから部分的にif文を削除すると、削除リンクが表示されます。私はすでにadminとcurrent_userを定義して以来何が間違っているのか分かりません。

私はあらゆる種類の指導に全然感謝します。以下の情報が十分に

https://github.com/krischery2150/Try2150-master/tree/updating-users

class UsersController < ApplicationController 
    before_action :logged_in_user, only: [:index, :edit, :update, :destroy] 
    before_action :correct_user, only: [:edit, :update] 
    before_action :admin_user,  only: :destroy 


    def new 
    @user = User.new 
    end 

    def show 
    @user = User.find(params[:id]) 
    end 

    def create 
    @user = User.new(user_params) 
    if @user.save 
     log_in @user 
     flash[:success] = "Welcome to the Sample App!" 
     redirect_to @user 
    else 
     render 'new' 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
     flash[:success] = "Profile Updated" 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

    def index 
    @users = User.paginate(page: params[:page]) 
    end 

    def destroy 
    User.find(params[:id]).destroy 
    flash[:success] = "Your profile was deleted" 
    redirect_to users_url 
    end 

    private 

    def user_params 
     params.require(:user).permit(:username, :email, :password, 
            :password_confirmation, :user_about_me, 
            :birthday, :avatar, :gender) 

    end 

    ##Before filters method 
    # Confirms that a given user is logged in. Only when these conditions are met the user will 
    # be able to update or edit their page 

    def logged_in_user 
    unless logged_in? 
     store_location 
     flash[:danger]= "Please Log In" 
     redirect_to login_url 
    end 
    end 

# Confirms the correct user. 
    def correct_user 
    @user = User.find(params[:id]) 
    redirect_to(root_url) unless current_user?(@user) 
    end 

    # Confirms an admin user. 
    def admin_user 
    redirect_to(root_url) unless current_user.admin? 
    end 


end 

十分でない場合私のプロジェクトはgithubの上でもあります。

class User < ActiveRecord::Base 
    before_save {self.email = email.downcase} 
    attr_accessor :remember_token 

    has_attached_file :avatar, styles: { medium: "300x300>", thumb: "50x50>" }, default_url: "/images/:thumb/missing.png" 
    validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ 
    # this before_save is a callback method. What it does is before it saves the email 
    #address it calls back and transforms all the letters into lower case. Had to do the indexing 
    #in active record in order for the method to work 
    validates :username , presence: true, length: {maximum: 250} 
     VALID_EMAIL_REGEX = /\A[\w+\-.][email protected][a-z\d\-.]+\.[a-z]+\z/i 
     #code that ensures that a user puts the right format for emails in signup 
     #fields 
    validates :email, presence: true, length:{maximum: 50}, 
             format:{with: VALID_EMAIL_REGEX }, 
             uniqueness:{ case_sensitive: false } 
             #rails still assumes that uniquess is true 
             #whether the user types CAMELcase or lowercase 
    validates :password, presence: true, length:{maximum: 50}, allow_nil: true 
    validates :user_about_me, presence: true 
    validates :birthday, presence:true 
    has_secure_password 

    # Returns the hash digest of the given string. 
    def User.digest(string) 
     cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 
                BCrypt::Engine.cost 
     BCrypt::Password.create(string, cost: cost) 
    end 


    ## returns a random user token 
    def User.new_token 
     SecureRandom.urlsafe_base64 
    end 

    # Remember a given user to the database for use of persistent sessions 

    def remember 
     self.remember_token = User.new_token 
     update_attribute(:remember_digest, User.digest(remember_token)) 
    end 

    ##returns true if given token matches the digest 
    def authenticated?(remember_token) 
     return false if remember_digest.nil? 
     BCrypt::Password.new(remember_digest).is_password?(remember_token) 
    end 

    def forget 
     update_attribute(:remember_digest, nil) 
    end 

    def log_out 
     forget(current_user) 
     session.delete(:user_id) 
     @current_user = nil 
    end 
    end 

これは、すべてのユーザーが表示インデックスページの部分レンダリングのコードです。

<div class="col-md-9 col-offset-3" id="index-profile"> 

    <li class="users"> 
    <div class="col-xs-3 profilepic-container"> 
     <%= image_tag user.avatar.url %> 
    </div> 
    <%= link_to user.username, user %> 
    <% if current_user.admin? && !current_user?(user) %> 
    | <%= link_to "delete", user, method: :delete, 
            data: { confirm: "You sure?" } %> 
     <% end %> 
    </li> 

答えて

2

あなたの部分での削除リンクは真であることが要求されている2つの条件があります。ユーザーは管理者でなければならず、そのプロファイルは自分のプロファイルであってはなりません。したがって、管理ユーザーが唯一のユーザーの場合は、削除リンクは表示されません。

2人目のユーザーを作成して、そのユーザーの削除リンクが表示されているかどうかを確認してください。

+0

私はあなたが上で示唆したことをしたが、結果は同じままだった。しかし、私はcurrent_user.adminを取る?部分的にifステートメントをオフにしました。私は、コンソール(User.new)が管理者ブールの移行が成功したことを示すので、困惑していますか?私は何をすべきかわからない。 –

関連する問題