Запись обновления API Ruby On Rails, только если пользователь вошел в систему, соответствует электронной почте

0

Привет всем, поэтому я в настоящее время пишу 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 ответ

3
Лучший ответ

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

  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. В прошлом я обнаружил (в моих собственных проектах), что использование 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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню