Запись обновления API Ruby On Rails, только если пользователь вошел в систему, соответствует электронной почте - PullRequest
0 голосов
/ 06 июня 2018

Привет всем, поэтому я сейчас пишу API для Ruby on Rails и вроде как попал в кирпичную стену при обновлении заведения в базе данных.

Что я пытаюсь выполнить:

Если у пользователя, вошедшего в систему в данный момент, совпадает адрес электронной почты, совпадающий с адресом электронной почты, связанным с заведением, разрешите этому пользователю обновить информацию о заведениях.

К сожалению, я застрял при попытке выяснить, как проверить, соответствует ли текущий пользователь, вошедший в систему, электронной почте заведения.Любая помощь идентифицирует.Спасибо

Вот мой код:

def update
    establishment = Establishment.update(establishment_params)
    current_user ||= User.find(session[:user_id]) if session[:user_id]

    if !session[:user_id]
      render json: {status: 'Information Updated'}, status: :ok
    else
      render json: {status: 'Not Verified'}, status: :unprocessable_entity
    end
  end

  def establishment_params
    params.permit(
      :name,
      :address,
      :city,
      :state,
      :zipcode,
      :phone    
    )
  end

1 Ответ

0 голосов
/ 06 июня 2018

Возможно, попробуйте что-то вроде этого:

  def update
    if authorized?
      establishment.assign_attributes(establishment_params)
      if establishment.valid?
        establishment.save!
        render json: {status: 'Information Updated'}, status: :ok
      else
        render json: {status: 'Not Updated', errors: establishment.errors.full_messages}, status: :unprocessable_entity
      end
    else
      render json: {status: 'Not Verified'}, status: :unauthorized
    end
  end

private

  def authorized?
    # Guessing at how to access email addresses. You'll need to fix to fit
    # your actual record structures.
    return false unless current_user && current_user.email_address
    return false unless establishment && establishment.email_address
    current_user.email_address == establishment.email_address
  end

  def establishment
    # memoization for @establishment
    @establishment ||= find_establishment 
  end

  def find_establishment
    # Will throw an error if Establishment not found. Guessing on 
    # params[:id]. You'll need to correct to wherever/however you 
    # pass in the Establishment id.
    Establishment.find(params[:id])
  end

При создании вашего API вы, вероятно, захотите использовать :unprocessable_entity и :unauthorized способами, которые достаточно обычны.Возвращение статуса :unprocessable_entity, когда пользователь не авторизован, кажется мне необычным.Я бы предположил, что для этого нужен статус :unauthorized

Кроме того, лично я предпочитаю подход с запоминанием для подхода before_action.В прошлом я обнаружил (в своих собственных проектах), что использование before_action может привести к ошибкам, которые трудно диагностировать.Но с другой стороны, я искусен в создании трудно диагностируемых ошибок.Итак, действуйте так, как вам нравится.

О, и наконец, я использовал assign_attributes вместо update.assign_attributes не делает сохранения, что дает вам возможность сделать establishment.valid? и обработать случай, когда предоставленные атрибуты недействительны.В таком случае статус :unprocessable_entity (соответственно) возвращается вместе с полными сообщениями об ошибках.

Если хотите, вы можете пойти немного за борт и сделать что-то вроде:

  def update
    authorized ? update : unauthorized
  end

private

  def authorized?
    return false unless current_user && current_user.email_address
    return false unless establishment && establishment.email_address
    current_user.email_address == establishment.email_address
  end

  def establishment
    @establishment ||= find_establishment 
  end

  def find_establishment
    Establishment.find(params[:id])
  end

  def unauthorized
    render json: {status: 'Not Verified'}, status: :unauthorized
  end

  def update
    establishment.assign_attributes(establishment_params)
    establishment.valid ? save_and_return : return_errors
  end

  def save_and_return
    establishment.save!
    render json: {status: 'Information Updated'}, status: :ok
  end

  def return_errors
    render json: {status: 'Not Updated', errors: establishment.errors.full_messages}, status: :unprocessable_entity
  end

Лично мне нравится много крошечных методов, каждый из которых имеет свое специфическое назначение, в отличие от больших методов, которые имеют много общего.Это немного за борт в данном конкретном случае использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...