Пытаюсь переписать мой контроллер профиля, который на данный момент не работает. Я использую 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 всегда содержит имя пользователя и поэтому не может обновляться
Profile.where(params[:id])
в вашем действии обновления. Это вернет отношение, а не запись. Дополнительный совет: используйтеunless
вместоif not
, это более грубо и, возможно, более понятно. - person m_x   schedule 29.02.2012if not
. А также я бы добавил, что вы можете сделать что-то вродеmatch '/users/:username/edit(/:what)' => "profiles#edit", :defaults => { :what => "basic" }, :as => :edit_user
, чтобы разрешить обычные URL-адреса в спокойном стиле, но при этом разместить более пояснительные. - person Ekampp   schedule 29.02.2012