0

在我的 Rails 应用程序中,我正在寻找一种保存帖子的方法,并提出一条“已保存”的通知。无需重定向到任何地方。

我可以在控制器中执行此操作还是必须使用 Ajax?如果我必须使用 Ajax,有没有简单的方法来实现它?

以下是我的控制器中的创建和更新操作:

def create
  @document = current_user.documents.build(params[:document])

  if @document.save
    redirect_to @document.edit, notice: 'Saved'
  else
    render action: "new"
  end
end

def update
  @document = current_user.documents.find_by_url_id(params[:id])

  if @document.update_attributes(params[:document])
    redirect_to @document, notice: 'Saved'
  else
    render action: "edit"
  end
end
4

2 回答 2

0

看起来您正试图用“编辑文档”表单替换“新文档”表单,并显示一条警告说它已保存。

老实说,可能最简单的方法是使用 jQuery 将整个表单替换为部分表单。它不是最苗条的,有办法做所有的 Javascript 客户端,但这会让你开始。

假设您有一个名为“新文档”的部分表单,请_new.html.erb创建一个名为的文件create.js.erb并将其放入其中:

$edit_form = "<%= escape_javascript(render :partial => 'new', :locals => {document: @document}) %>"
$("#document_form_container").html($edit_form)

然后确保您的表单:remote => trueform_for标签中。

于 2012-12-13T20:52:49.873 回答
0

如果您不想创建新的控制器操作(并且您可能不应该),那么我建议您将创建和更新操作设置为如下所示:

def create
  @document = current_user.documents.build(params[:document])

  if @flag = @document.save
    respond_to do |format|
      format.html
      format.js
    end
  else
    render action: "new"
  end
end

def update
  @document = current_user.documents.find_by_url_id(params[:id])

  if @flag = @document.update_attributes(params[:document])
    respond_to do |format|
      format.html
      format.js
    end
  else
    render action: "edit"
  end
end

然后在 app/views/documents/create.js.erb 中:

var results_html;
var status;

<% if @flag %>
  results_html = $('<%= j(render("document"))%>');
  status = "success";
<% else %>
  results_html = $('');
  status = "failure";
<% end %>

$('destination').append(results_html); //assuming you're inserting a list item or some content besides the alert onto the page

alert(status); // replace this with your actual alert code

在 update.js.erb 中:

var results_html;
var status;

<% if @flag %>
  results_html = $('<%= j(render("document"))%>');
  status = "success";
<% else %>
  results_html = $('');
  status = "failure";
<% end %>

$('#<%= @document.id %>').replaceWith(results_html); //assuming you're replacing a list item or some content besides the alert onto the page.  also, make sure you're searching for the correct element id

alert(status); // replace this with your actual alert code

希望这可以帮助。关键是 rails 允许您为控制器操作上的不同访问方法定义不同的模板。当您发出 AJAX 请求时,您将默认获得 js.erb 视图,这将允许您通过返回将在服务器返回时运行的 javascript 来操作当前页面。

于 2012-12-14T03:01:16.143 回答