LINUX.ORG.RU

Не работает Controller#update

 


0

1

Привет, у меня снова проблема :)

Когда обновляю юзера (изменяю имя - fullname)

def update
    @user = User.find(params[:user])
    if @user.update_attributes(@user)
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

То вылезает ошибка:

ArgumentError in UsersController#update

Unknown key: fullname

Если контроллер выглядит иначе,

def update
    if @user.update_attributes(params[:user])
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

то ошибка такая

NoMethodError in UsersController#update

undefined method `update_attributes' for nil:NilClass

Помогите пожалуйста, будьте котиками :3

edit.html.haml выглядит так:

%h3 Update profile

= form_for(@user) do |f|

	= f.text_field :fullname, placeholder: "Your name"

	= f.submit "Update"



Последнее исправление: VoidandNull (всего исправлений: 2)

Попробуй

@user = User.find(params[:id])
if @user.update_attributes(params[:user])

Вообще, мало информации. Если не поможет, покажи выхлоп терминала:
rake routes | grep user

P.S.Lorcode почему-то отсутствует в списке разметок.

tuxin
()
Ответ на: комментарий от tuxin

Тогда срабатывает 'else'.

voidandnull@LocalMain:~/p/r/posgrehaml$ rake routes | grep user
      users     GET     /users(.:format)          users#index
                  POST   /users(.:format)          users#create
   new_user GET     /users/new(.:format)      users#new
  edit_user  GET     /users/:id/edit(.:format) users#edit
       user    GET     /users/:id(.:format)      users#show
                 PUT     /users/:id(.:format)      users#update
                 DELETE /users/:id(.:format)      users#destroy
     signup              /signup(.:format)         users#new
 

VoidandNull
() автор топика

Ваш второй вариант указывает, что вы совсем не понимаете, что происходит.

anonymous
()

Давно это было, но found возвращает не совсем, то что вы думаете, если память не изменяет. Попробуйте заменить на first.

anonymous
()
Ответ на: комментарий от anonymous

Не совсем то, сейчас нет rails под рукой, так не могу сказать.

anonymous
()
Ответ на: комментарий от VoidandNull

Просто предположение, что find выдает не модельку, а массив или что-нибудь в этом ключе. Продампи, что вернул find и что в params. И выложи сюда.

anonymous
()
Ответ на: комментарий от VoidandNull

Отредактируй и сразу выполни в терминале
tail -n 250 log/development.log

Можешь выложить выхлоп куда-нибудь и дать ссылку. Или смотри рядом с последним PUT, там должны быть все параметры и указана причина, почему не обновилось.

tuxin
()
Ответ на: комментарий от tuxin

Спасибо, но я, кажется, почти решил. Решение такое:

def update
    @user = User.find(params[:id])
    if @user.update_attributes!(params[:user])
      flash[:success] = "Profile updated"
      sign_in @user
      redirect_to @user
    else
      flash[:notice] = "Smth went wrong."
      render 'edit'
    end
  end
Теперь, правда, требует пароль, но это уже не проблема. Спасибо, чуваки! :)

VoidandNull
() автор топика
Ответ на: комментарий от VoidandNull

Прекратите быдлокодить!!! Почитайте доки хоть немного! Ну нельзя же так наугад, у вас багов будет немеряно и возможно даже связанных с безопасностью. @user - instance variable которая должна быть инициализирована перед использованием, если она не инициализирована то её значение - nil, и естественно она не имеет метода update_attributes. Ваш последний код так же не корректен. Нет смысла проверять значение @user.update_attributes! (обратите внимание на '!' в конце). Этот метод ничего не возвратит в случае ошибки а raise exception. http://api.rubyonrails.org/

tyler19
()
Ответ на: комментарий от VoidandNull

Покажите правильное решение, пожалуйста.

Сгенерируйте scaffold и увидите правильное решение. Разберите сгенерированный scaffold'ом controller с использование API документации.

tyler19
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.