#ruby-on-rails
#ruby-on-rails
Вопрос:
Я делаю это:
user = User.find( params[:id] )
когда я делаю:
user.section_id
в нем говорится:
nomethoderror exception undefined method 'section_id' for <#Array:0x.....>
Почему там написано <#Array?
В консоли rails все работает нормально, когда я делаю: u = User.find(2)
Обновить
Мой javascript делает это:
$.ajax({
type: "POST",
url: "/user/add_section",
dataType: "html",
data: { id: id, section_text: sectionText
},
success: function(payload) {
},
error: function(jqx, ts, et) {
},
complete: function(){}
});
Используя Chrome, я вижу, что идентификатор равен 8.
Мое действие контроллера:
def add_section
user = User.find(params[:id])
section_id = user.section_id # error!!
end
Я вставил отладчик в этот код, и объект загружается должным образом, просто он загружается в массив, поэтому это работает:
user[0].section_id
но в irb это отлично работает с: user.section_id для точно такого же значения, переданного методу find.
Комментарии:
1. Что находится в params [:id]?
2. Например, я отправляю целочисленный идентификатор = 8.
3. Что-то с ошибкой
sectionid
и методомsection_id
?4. @jakub нет, это был просто мой тип, исправлено.
5. chrome показывает, что мои данные формы заголовка: id[% 5D: 8 не уверен, почему это не id: 8??
Ответ №1:
user = User.find( params[:id] )
Похоже, что params[:id]
возвращает массив, так user
что на самом деле это массив пользователей. Или это может быть просто перенос одного идентификатора в []
like: user = User.find [8]
— который все равно вернет массив с одним элементом
Итак, вы должны отладить свой params[:id]
.
UPD
Также здесь проблема в вашем приложении. Это не REST. Вы должны вызвать /user/:id/add_section
path вместо /user/add_section
.
Ваши маршруты:
resources :users do
post :add_section, :on => :member
end
Комментарии:
1. спасибо за оставшийся совет, как тогда выглядел бы мой route.rb с этим? прямо сейчас это: post ‘add_section’
2. Я обновил свой ответ. Но как насчет вашего волшебства
params[:id]
? Вы это исправили или просто отладили?3. что ж, теперь я получаю идентификатор из URL, поэтому больше не передаю его. все еще не понимаю, почему это становилось массивом!
Ответ №2:
User.find может возвращать несколько типов. Вы не передаете правильный аргумент для вашего примера. Вы можете увидеть параметры, отправленные контроллеру в журнале сервера, или просто распечатать его через p params
Комментарии:
1. Я не знаю, откуда вы это взяли. Но это означает id[]: 8. Так что, вероятно, вы передаете массив с одним элементом — 8. И когда вы передаете array в метод find, он также возвращает array.
2. Как вы вызываете эту страницу? Какой URL? Как вы создаете свою ссылку на эту страницу? Через какой-нибудь link_to ? Какие аргументы вы туда передаете?
3. Ваше обновление на самом деле не отвечает на вопрос. Это показывает, что вы отправляете
id: id
вызов Ajax, но не показывает, как вы получаетеid
переменную, назначенную в первую очередь.