Rails Idiom用于更新后通知

时间:2009-10-21 02:41:05

标签: ruby-on-rails

所有/任何人,

很奇怪流行的Rails成语用于指示特定操作对最终用户的成功/失败?

例如,假设您有一个宁静的用户资源,并在所述用户资源上调用更新;一旦更新完成并且我已将用户路由回edit.html.erb - 我想表明操作是否成功(哪一个会说= =没有错误)。

尽管如此,很快就会想到三种方法:

  1. if @ user.errors.blank?然后显示'成功'。这不适用于edit.html.erb

  2. 的初始显示
  3. 根据@ user.save / update_attributes的结果更新闪存以指示成功/失败。如果flash [:status] ==:成功则显示'成功'。

  4. 在更新操作中设置实例变量 - 很像flash - @success == true。如果@success然后显示'成功'

  5. 我错过了什么吗?也许有一种关于AR的方法,我只是没有看到?如果@ user.updated?

    谢谢! 科里威尔克森

1 个答案:

答案 0 :(得分:1)

我通常只使用flash [:notice]来显示通知消息,例如“您的帐户已成功更新”,以及flash [:error]或error_msg_for的错误消息。对于所有其他类型的错误消息,我使用error_msg_for由验证失败引起的错误和flash [:error]。除非绝对必要,否则我要注意不要将它们设置在同一个动作上。

我还尝试避免将用户返回到他们刚刚提交的表单,如果他们的操作成功了。我认为它发送了相互矛盾的信号来发布成功消息并将用户发送回他们刚刚提交的表单。我的经验法则是“重定向成功,渲染失败”。例如,如果@user保存在更新中,我将redirect to @user,但会呈现:如果保存不成功,则编辑。

示例控制器代码。

before_filter :identify_user, :except => :index

def update
  @user = User.find(params[:id])
  if @user.update_attributes(params)
    flash[:notice] = "Your account was updated successfully"
    redirect_to @user
  else
    render :action => :edit
  end
end

def index
end

def identify_user
  begin 
  @user = User.find(params[:id])
  rescue
    flash[:error] = "You specified an unknown user"
    redirect users_path
  end
end

我的通知部分在我的应用程序布局中调用。

<div id="notification_area">
  <% flash.each do |key, value| %>
    <% if value %>
      <div id="<%=key%>">
        <%= value %>
      </div>
    <%end%>
  <%end%>
</div>