У меня есть форма редактирования для @users.
Там у меня есть text_field: имя пользователя
<%= form_for @user, :url => { :action => "update" } do |f| %>
<%= render 'shared/error_messages', :target => f.object %>
<div class="field">
<%= f.label :username %><br />
<%= f.text_field :username %>
</div>
В моей модели User я использую гем friendly_id, также установлен: username. Так что мои URL выглядят как domain.com/users/:username вместо: id.
has_friendly_id :username
Теперь в макете приложения я также использую @ user.username в своей навигации для ссылки на профиль.
Все работает хорошо, КРОМЕ, если я оставлю поле: username пустым при сохранении. Не удалось сохранить причину проверок,
validates :username, :presence => true, :uniqueness => { :case_sensitive => false }, :length => { :maximum => 50 }
и снова пытается отредактировать «edit». Но чтобы сделать «правку», нам нужно имя пользователя, чтобы создать ссылку в навигационной панели. И, очевидно, он передается как username => "", даже если он по праву не был сохранен, и соответствующие проверки выполнены.
def update
@user = current_user
if @user.update_attributes(params[:user])
flash[:success] = "Account updated."
redirect_to :back
else
@title = "Edit"
render "edit"
end
конец
Итак, я получаю RoutingError:
No route matches {:action=>"show", :controller=>"users", :id=>#<User id: 6, username: "", persistence_token: "c2f2545659c186131537155347f46f7da5eb0d51b27707e71da...", created_at: "2011-03-14 14:26:48", updated_at: "2011-03-15 01:54:33", email: "test@test.com", crypted_password: "0d6489b1447d278bc4f7c86bab13787f226a10a302b43ec02ff...", password_salt: "Lq2G80iSVeaitB5PDwf", perishable_token: "Tm7Jzyq8QutfaxL3JLZ8", active: true>}