новичок: проблемы с обновлением/перенаправлением профиля и friendly_id

Пытаюсь переписать мой контроллер профиля, который на данный момент не работает. Я использую friendly_id, чтобы иметь URL-адреса, как показано ниже, с частичными файлами edit_basics.haml, edit_details.haml и т. д.

  • /пользователи/я/редактировать/основы
  • /пользователи/я/редактировать/интересы
  • /пользователи/я/редактировать/детали

Проблема в обновлении моего профиля и перенаправлении на правильный путь после обновления. Я искал и пробовал несколько вещей до сих пор безрезультатно.

  • после отправки формы редактирования он перенаправляет на /profiles/me
  • после обновления /users/me/edit/basics он должен вернуться в это место Обновление выдает ошибку в

    неопределенный метод `update_attributes' для #‹#:0x007f876e77d768>

    {"utf8"=>"✓", "_method"=>"put", "authenticity_token"=>"wqDebPGdHvXszFvXcaeWwRewA6puTVlv5iCXX1ZD3KU=", "profile"=>{"form"=>"основы", "description"=>" "}, "commit"=>"Сохранить", "id"=>"myusername"}

    Конечно, идентификатор не может быть именем пользователя.

Маршруты

  match '/users/:username' => "profiles#show"
  match '/users/:username/edit/:what' => "profiles#edit", :as => :edit_user

Обновить действие:

  def update

    @profile = Profile.where(params[:id])

    respond_to do |format|
      if @profile.update_attributes(params[:profile])
        format.html { redirect_to @profile, :action => "edit", :what => @profile.form,  notice: 'Profile was correctly updated.' }
      else
        format.html { @profile, :action => "edit", :what => @profile.form }
      end
    end
  end

Изменить действие:

def edit

@profile = Profile.find(params[:username])
what = params[:what]

if not what.nil?
  if ["basics", "location", "details", "photos", "interests"].member?(what)
    render :action => "edit_#{what}"
  else
    render :action => "edit_basics"
  end
end

конец

ОБНОВЛЕНИЕ: кажется, что атрибут id всегда содержит имя пользователя и поэтому не может обновляться


person Rubytastic    schedule 29.02.2012    source источник
comment
Я думаю, что с этим id все в порядке - так работает friendly_id. ID зависит от столбца slug. В своем действии обновления попробуйте использовать find (Profile.find(params[:id]))   -  person zachar    schedule 29.02.2012
comment
не уверен, но я думаю, что часть проблемы связана с Profile.where(params[:id]) в вашем действии обновления. Это вернет отношение, а не запись. Дополнительный совет: используйте unless вместо if not, это более грубо и, возможно, более понятно.   -  person m_x    schedule 29.02.2012
comment
@_x Я то же самое думал о операторе if not. А также я бы добавил, что вы можете сделать что-то вроде match '/users/:username/edit(/:what)' => "profiles#edit", :defaults => { :what => "basic" }, :as => :edit_user, чтобы разрешить обычные URL-адреса в спокойном стиле, но при этом разместить более пояснительные.   -  person Ekampp    schedule 29.02.2012


Ответы (1)


Попробуйте обновить эту строку:

@profile = Profile.where(params[:id])

В вашем контроллере к этому и посмотрите, поможет ли это:

@profile = Profile.where({ :id => params[:id] }).first

Это вернет экземпляр профиля, а не критерии.

Надеюсь, поможет.

\\ Эмиль

person Ekampp    schedule 29.02.2012
comment
Лучше использовать @profile = Profile.find(params[:id]) + небольшой рефакторинг раздела if not what.nil? можно найти здесь... gist.github.com/1964911 - вероятно, просто предпочтение, но .present? определяется как !blank?, который проверяет как .nil?, так и .empty? - person Matenia Rossides; 03.03.2012