1

在我的 Rails 应用程序中添加:remote => true到我的编辑表单时,提交工作正常,但现在我的程序不显示错误消息。我尝试了多种解决方案,但都没有奏效。谁能指出我解决这个问题的正确方向?如果条目保存成功,则会在 div 中添加一条通知消息,这是我在 edit.js.erb 中编写的。我还尝试将“错误消息”添加到错误消息 div 中,但@entry.errors.any?在添加:remote => true.

这是我要更新的表单中的编辑 div。

<div id="errors">
  <% if @entry.errors.any? %>
      <h2><%= pluralize(@entry.errors.count, "error") %> prohibited this entry from being saved:</h2>

      <ul>
      <% @entry.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
  <% end %>
</div>

我也有它的部分内容,我的 edit.js.erb 尝试用新呈现的部分更新 div,但现在 @entry.errors.any?不再在这里返回 true .. 这也是我的控制器...

# GET /entries/1/edit
def edit
  @entry = Entry.find(params[:id])

  respond_to do |format|
    format.html
    format.js
  end
end


def update
  @entry = Entry.find(params[:id])

  respond_to do |format|
    if @entry.update_attributes(params[:entry])
      format.html { redirect_to edit_entry_path(@entry), notice: 'Entry was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.json { render json: @entry.errors, status: :unprocessable_entity }
    end
  end
end
4

3 回答 3

2

您可以将控制器更改为此:

def update
  @entry = Entry.find(params[:id])

  respond_to do |format|
    if @entry.update_attributes(params[:entry])
      format.html { redirect_to edit_entry_path(@entry), notice: 'Entry was successfully updated.' }
      format.json { head :no_content }
    else
      format.html { render action: "edit" }
      format.js
    end
  end
end

创建一个 app/views/my_controllers/update.js.erb 并放置如下内容:

//Just normal javascript and some JS
errors = '';
<% @entry.errors.full_messages.each do |msg| %>
  errors += '<%= msg %>\n';
<% end %>
alert(errors);

编辑:添加第二种方法

你也可以这样做:

$("#my_form")
 .bind("ajax:success", function(event, data, status, xhr) {
  //Do my function
});
于 2012-07-19T00:27:02.767 回答
1

您想要响应format.js并将错误呈现添加到 your.js.erb

响应.json将仅返回数据,因此不会运行其响应。

于 2012-07-19T00:30:37.640 回答
0

我创建了一个部分_errors.html.erb

<% if @entry.errors.any? %>
    <h2><%= pluralize(@entry.errors.count, "error") %> prohibited this entry from being saved:</h2>
    <ul>
    <% @entry.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
    <% end %>
    </ul>
<% end %>

我创建了update.js.erb

$("#errorlist").html("<%= escape_javascript(render('errors')) %>");

其中 #errors 指的是我的表单中的 a ,并且错误是部分的。最后我的控制器现在是这样的。# PUT /entries/1 # PUT /entries/1.json def update @entry = Entry.find(params[:id])

def update
  @entry = Entry.find(params[:id])

  respond_to do |format|
    if @entry.update_attributes(params[:entry])
      format.html { redirect_to edit_entry_path(@entry), notice: 'Entry was successfully updated.' }
      format.json { head :no_content }
    else
      format.html
      format.js
    end
  end
end

另外,由于我只希望在我的编辑表单上使用 ajax,而不是我的创建表单(将 :remote => true 添加到 _form.html.erb 效果两者)我还在 _form.html.erb 中更改了这一行

<%= form_for @entry, :remote => true, :html => {:id => "editform", :multipart => true} do |f| %>

<%= form_for @entry, :remote => current_page?(:controller => 'entries', :action => 'new') ? false : true, :html => {:id => "editform", :multipart => true} do |f| %>

感谢您的帮助,那些帮助我实现解决方案的人。

于 2012-07-19T18:55:39.833 回答