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