我有@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>
在我的用户模型中,我使用了friendly_id gem,设置为:username。所以我的网址看起来像domain.com/users/:username而不是:id。
has_friendly_id :username
现在在我的应用程序布局中,我还在导航中使用@ user.username链接到配置文件。
一切正常,除非我保存我的:username字段为空。它无法保存验证原因,
validates :username, :presence => true, :uniqueness => { :case_sensitive => false }, :length => { :maximum => 50 }
并尝试再次渲染“编辑”。但要渲染“编辑”,我们需要用户名来在导航栏中创建链接。显然它已经传递为username =&gt; “”,即使它合理地未能保存并且已经进行了适当的验证。
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>}
答案 0 :(得分:1)
首先,重定向到:back,即使您成功更改了用户名,也可能会因为URL本身不同而失败。所以你应该这样做
redirect_to @user
代替。
如果你想使用username
字段作为friendly_id的基础,那么最好不要让它为空白,你可以通过向模型添加验证来强制执行:
class User < ActiveRecord::Base
...
validates_presence_of :username
...
end
或者,如果您的应用中出于某种原因将它们留空,则可以强制Rails根据数字ID而不是在这些情况下的friendly_id生成URL。
要执行此操作,您需要将用户名值设置为nil
而不是空白,然后执行
redirect_to @user
或
redirect_to user_url(@user)
在这种情况下,您还需要使用:allow_nil => true
选项has_friendly_id
。
我是FriendlyId的作者,如果这不能解决您的问题,请随时发送消息给FriendlyId的Google Group或发送给我个人norman@njclarke.com,我会尽力帮助您。
答案 1 :(得分:0)
如果验证失败,您根本不需要重新渲染编辑屏幕。
如果您使用ajax更新页面并使用remote_form_for(Rails 2)或form_for:remote =&gt;它可能会更好。提交表单时为true(Rails 3)。这样,如果您的表单通过验证,您可以像您尝试的那样重定向用户,但如果验证失败,则无需实际离开页面,您只需将验证消息发送回表单即可。
Simone Carletti的博客在如何做到这一点上有一个相当不错的例子。
http://www.simonecarletti.com/blog/2010/06/unobtrusive-javascript-in-rails-3/
Ryan Bates提出了一个如何使用它的简单例子。