Пользовательская модель ведет себя странно, работает в консоли rails, указывая неопределенный метод в контроллере

#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 переменную, назначенную в первую очередь.