2016-05-11 2 views
1

Я пытаюсь настроить приложение ruby ​​на rails таким образом, чтобы я мог обновлять значения с помощью HTTP-патч-вызовов, например, с помощью приложения «Угловое». В настоящее время у меня есть следующий метод которого я ожидаю, что это работает:Обновление объектов в RoR с вызовом API

users_controller.rb

def safe_params 
    params.require(:id).permit(:email) 
    end 

    def update 
    user = User.find(params[:id]) 
    user.update_attributes(safe_params) 
    render nothing: true, status: 204 
    end 

Однако, я получаю следующее сообщение об ошибке, когда я прохожу некоторые простые JSON:

неопределенный метод «разрешение» для «500»: строка

Пройден JSON:

{"email":"[email protected]", "id":500} 

Вы, ребята, знаете, что я делаю неправильно?

+0

'require' используется для извлечения вложенной структуры, поднимая ошибку, если она отсутствует. В этом случае это не имеет особого смысла. – Stefan

+0

Вы используете последнюю версию Rails? Кажется, это [по книге] (http://api.rubyonrails.org/classes/ActionController/Parameters.html). – tadman

ответ

4

Я считаю, что вы непонимание цели require и permit.

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

permit работает как фильтр, он явно разрешает использование только определенных полей. Возвращаемое значение - это исходные параметры Hash, whitelisted.

В вашем случае, require не имеет никакого смысла, если вы не пройдете вложенную JSON как этот

{"user": {"email":"[email protected]", "id":500}} 

, но даже в этом случае было бы

params.require(:user).permit(:email) 

В ваш текущий сценарий, правильный код

params.permit(:email) 
0

Вы должны изменить порядок между требовать и разрешения, как этот

params.permit(:email).require(:id) 

, потому что разрешение возвращает весь хэш, в то время как требуется, возвращает конкретный параметр

Ссылка here

UPDATE

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

+0

Хотя это не вызывает ошибки, это не то, что ожидает OP. 'require (: id)' просто возвращает параметр 'id', т. е.' "500" ' – Stefan

+0

Интересно, что определение' require' противоречит примеру, указанному в верхней части этой страницы. – tadman

+0

Это поведение ActionController: параметры ведут себя, я думаю, что он позволяет иметь все проверки в одной строке –

0

Один из способов исправить это, соблюдая условия ирит из документации Rails:

def safe_params 
    params.require(:user).permit(:email) 
end 

И обновление: JSON

{"user": {"email":"[email protected]"}, "id": 500} 
Смежные вопросы