代码之家  ›  专栏  ›  技术社区  ›  Cory

用于更新后通知的Rails习惯用法

  •  0
  • Cory  · 技术社区  · 16 年前

    所有/任何人,

    奇怪的是,目前流行的Rails习惯用法是什么,用于向最终用户指示特定操作的成功/失败?

    例如,假设您有一个RESTful用户资源,并且在所述用户资源上调用更新;更新完成后,我将用户路由回edit.html.erb-我想指示操作是否成功(其中一个会说==没有错误)。

    也就是说,我们很快就会想到三种方法:

    1. 如果@user.errors.blank?然后显示“成功”。这不适用于edit.html.erb的初始显示

    2. 根据@user.save/update_属性的结果更新flash以指示成功/失败。如果flash[:status]=:成功,则显示“成功”。

    3. 在更新操作中设置一个实例变量-很像flash-@success==true。如果@success,则显示“success”

    我错过什么了吗?也许有一个关于ar的方法我只是看不到?如果@user.updated?

    谢谢! 科丽威尔克森

    1 回复  |  直到 16 年前
        1
  •  1
  •   EmFi    16 年前

    我通常只使用flash[:notice]发送通知消息,例如“您的帐户已成功更新”,或者flash[:error]或 error_msg_for 错误信息。对于验证失败导致的错误,我使用error_msg_;对于所有其他类型的错误消息,使用flash[:error]。除非绝对必要,否则我注意不要让他们两个都采取相同的行动。

    我还试图避免将使用返回到他们刚提交的表单,如果他们的操作成功。我认为这是在发送矛盾的信号来发布一条成功消息,并将用户发送回他们刚提交的表单。我的经验法则是“成功时重定向,失败时呈现”。 redirect to @user 如果@user保存在更新中,但如果保存失败将呈现:edit。

    样本控制器代码。

    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>