Рельсы, где не работает запрос на авторизацию - PullRequest
2 голосов
/ 21 сентября 2019

Я пытаюсь создать метод авторизации (offer_authorised) для страницы (показать).К сожалению, кажется, что запрос where не работает должным образом с кодом, который у меня есть.

Я все еще могу получить доступ к странице со всеми пользователями, хотя я смогу получить к ней доступ, только если user_id равен текущемуидентификатор пользователя.

Offer.where("id = ? AND user_id = ?", 2, 2) 
  Offer Load (0.7ms)  SELECT "offers".* FROM "offers" WHERE (id = 2 AND user_id = 2) LIMIT $1  [["LIMIT", 11]]
 => #<ActiveRecord::Relation [#<Offer id: 2, amount: 950, status: "hyväksytty", rental_id: 1, user_id: 2, created_at: "2019-09-19 12:21:22", updated_at: "2019-09-21 11:08:52">]> 

Со стороны консоли, похоже, правильно возвращает правильную запись.

Вот мой контроллер предложений.

class OffersController < ApplicationController
    before_action :authenticate_user!
    before_action :offer_authorised, only: [:show]
    before_action :set_offer, only: [:accept, :reject]
    before_action :is_authorised, only: [:accept, :reject]

    def create
        rental = Rental.find(offer_params[:rental_id])

        if rental && rental.user_id == current_user.id
            redirect_to request.referrer, alert: 'Et voi tehdä tarjousta omasta kohteestasi.'
        end

        if Offer.exists?(user_id: current_user.id, rental_id: offer_params[:rental_id])
            redirect_to request.referrer, alert: 'Voit tehdä vain yhden tarjouksen tällä hetkellä.'
        end

        @offer = current_user.offers.build(offer_params)
        if @offer.save
            redirect_to my_offers_path, notice: 'Tarjous tehty.'
        else
            redirect_to request.referrer, flash: {error: @offer.errors.full_messages.join(', ')}
        end
    end

    def accept
        if @offer.odottaa?
            @offer.hyväksytty!
            @offer.rental.update(active: !@offer.rental.active?)
            flash[:notice] = 'Tarjous hyväksytty.'
        end
        redirect_to request.referrer        
    end

    def reject
        if @offer.odottaa?
            @offer.hylätty!         
            flash[:notice] = 'Tarjous hylätty.'
        end
        redirect_to request.referrer    

    end

    def show
        @offer = Offer.find(params[:id])
        @rental = @offer.rental_id ? Rental.find(@offer.rental_id) : nil
    end


    private

    def offer_authorised
        redirect_to dashboard_path, 
            alert: "Sinulla ei ole oikeuksia" unless Offer.where(id: params[:id], user_id: current_user.id)
    end


    def set_offer
        @offer = Offer.find(params[:id])
    end

    def is_authorised
        redirect_to root_path, alert: "Sinulla ei ole tähän oikeuksia." unless current_user.id == @offer.rental.user_id
    end

    def offer_params
        params.require(:offer).permit(:amount, :rental_id, :status)
    end
end

1 Ответ

2 голосов
/ 21 сентября 2019

Эта строка

Offer.where(id: params[:id], user_id: current_user.id)

всегда будет иметь значение true, поскольку возвращает ActiveRecord::Relation - даже если отношение оценивается как пустой массив.Поэтому ваш метод никогда не вызовет перенаправление.

Вместо этого используйте метод, который оценивается как true или false, например ActiveRecord.exists?:

Offer.exists?(id: params[:id], user_id: current_user.id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...