2015-09-15 2 views
0

Я знаю, что это было задано раньше, но я дважды проверял и убедился, что другие вопросы не работают для меня, но в любом случае пользователи могут редактировать других пользователей. Все, что вам нужно - это изменить идентификатор значения в адресной строке, и он подпишет вас непосредственно в учетной записи лиц. Мне нужно это исправление и перенаправить на страницу редактирования. Я пробовал несколько вещей без везения! Я не использую Devise.Пользователи могут редактировать других пользователей

Вот мой users_controller.rb,

class UsersController < ApplicationController 
    before_action :set_user, only: [:edit, :update, :destroy] 
    before_action :correct_user, only: [:edit, ] 

    after_action :signed_in_after_register, only: :create 

    def index 
    @users = User.all 
    @user = User.find(session[:user_id]) 
    end 

    def dashboard 
    @user = User.find(session[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3) 
    @comment = Comment.new 
    @post = Post.new 
    end 

    def newsfeed 
    @user = User.find(session[:user_id]) unless session[:user_id] == nil 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3) 
    end 

    def nav 
    @user = User.find(session[:user_id]) 
    end 
    def posts 
    @user = User.find(session[:user_id]) 
    @posts = @user.posts 
    end 

    def destroy 
    @user = User.find(session[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    end 

    def welcome 
    @user = User.find(params[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    end 
    def show 
    @user = User.find(params[:user_id]) unless session[:user_id] == "" 
    redirect_to login_path, notice: "You're not logged in" unless @user 
    @posts = @user.posts.order("created_at DESC").limit(3) 
    @comment = Comment.new 
    @post = Post.new 
    end 

    def new 
    @user = User.new 
    @post = Post.new(params[:post_id]) 
    end 

    def edit 
    @user = User.find(params[:user_id]) if params[:user_id] 
    redirect_to @dashboard_path unless @user 
    end 

    def create 
    @user = User.new(user_params) 
    respond_to do |format| 
     if @user.save 
     format.html { redirect_to dashboard_path, notice: 'User was successfully created!' } 
     format.json { render :profile, status: :created, location: @user } 
     else 
     format.html { render :new } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    def update 

    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to dashboard_path, notice: 'User was successfully updated.' } 
     format.json { render :profile, status: :ok, location: @user } 
     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
end 

    def destroy 
    @user.destroy 
    respond_to do |format| 
     format.html { redirect_to users_url, notice: 'User was successfully destroyed.' } 
     format.json { head :no_content } 
    end 
    end 

    private 
    def set_user 
     @user = User.find(params[:id]) 
    end 
    def correct_user 
     @user = User.find(params[:id]) unless session[:user_id] == "" 
    end 
    def signed_in_after_register 
     session[:user_id] = @user.id 
    end 
    def user_params 
     params.require(:user).permit(:first_name, :last_name, :bio, :password, :password_confirmation, :email, :age, :profile_picture, :post, :body) 
    end 
end 

Не уверен, что другой код, который вы, возможно, придется увидеть это является проблемой управления, Если вам не нужно какой-либо другой код моего просто комментировать и редактировать плохо мой вопрос сразу! Заранее спасибо!

+0

Итак, если я правильно понял, вы хотите, чтобы пользователь сам редактировал себя, но других пользователей не было. В таком случае, зачем вам нужен индекс? – BroiSatse

+0

@BroiSatse Возможно, он в порядке, позволяя пользователям читать записи друг друга. Нет необходимости, чтобы индексный профиль пользователя также был доступен для редактирования. – MarsAtomic

+0

@MarsAtomic - верный этому, просто подумал, что было бы неплохо использовать сингулярный ресурс, но индекс разрушает его. ;) – BroiSatse

ответ

0

Вы можете запретить пользователям редактировать профили друг друга, внедряя вспомогательный метод current_user и проверяя его в пределах вашего метода и update.

Добавьте следующий метод приложение/контроллеры/application_controller.rb

def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
end 

Этот помощник возвращает объект, представляющий пользователя текущего пользователя, в любом виде или контроллера.

Теперь в вашем app/controllers/users_controller.rb, заменить метод update следующим:

def update 
    if @user == current_user 
    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to dashboard_path, notice: 'User was successfully updated.' } 
     format.json { render :profile, status: :ok, location: @user } 
     else 
     format.html { render :edit } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    else 
    redirect_to some_other_path, notice: 'You do not have permission to edit the profile of another user.' 
    end 
end 

Вы также должны настроить ваш метод users_controller#edit использовать подобную логику, но я оставлю это упражнение для вас, так как вам нужно что-то узнать.

Смежные вопросы