Возможно, попробуйте что-то вроде этого:
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
Лично мне нравится много крошечных методов, каждый из которых имеет свое специфическое назначение, в отличие от больших методов, которые имеют много общего.Это немного за борт в данном конкретном случае использования.