0

这是前提:

我有一个名为 Rules 的模型,它有一个相应的控制器和视图。我希望用户能够从他们的仪表板创建一个新规则,它有一个单独的视图和控制器。

仪表板有三个选项卡,分别称为“规则”、“规则集”和“游戏”。每个选项卡都有自己的部分,所以对于规则,我使用的是 _rules.erb 部分,看起来像这样

<div id="dashboard-rules" class="dashboard-panel ui-nav-panel">
  <%= button_to'Create A Rule', '#', id: "create-rule-btn", class: "btn btn-primary" %>

  <div id="create-rule-form-container">
  </div>

...

</div>

使用 jQuery,我正在加载由规则控制器控制的新规则页面的内容,就像这样......

$('#create-rule-btn').click (e) ->
    e.preventDefault()
    $('#create-rule-form-container').load('/rules/new.html .form-horizontal')

这仅从 rules/new.html 加载表单。我的问题是,当我单击“保存规则”按钮时,它会重定向到 /rules URL。然后要么显示错误,要么说“规则已成功保存”。我希望它不要重定向并在仪表板中显示错误......再次,不要重定向到 /rules URL。

这是我的规则创建操作,我认为需要修改,我只是不确定如何:

def create
  @rule = Rule.new(params[:rule])

  respond_to do |format|
    if @rule.save
      format.html { redirect_to @rule, notice: 'Rule was successfully created.' }
      format.json { render json: @rule, status: :created, location: @rule }
    else
      format.html { redirect_to :controler => "dashboard"}
      format.json { render json: @rule.errors, status: :unprocessable_entity }
    end
  end
end

我知道我必须摆弄 respond_to 是如何工作的,我只是不知道如何。

4

1 回答 1

0

请记住,您需要在创建操作中设置您在仪表板中设置的所有变量,以便以下操作起作用。这是因为您正在渲染与仪表板相同的模板,因此您需要再次设置变量。

if @rule.save
  format.html { redirect_to dashboard_path, notice: 'Rule was successfully created.' }
  format.json { render json: @rule, status: :created, location: @rule }
else
  # initialize the variables needed on the dashboard here
  format.html { render template: 'dashboard/index' }
  format.json { render json: @rule.errors, status: :unprocessable_entity }
end

另一种解决方案是通过 ajax 提交表单,并在保存规则时刷新页面。

更新:快速js解决方案

在创建规则的表单中,添加以下内容

form_for @rule, html: { remote: true } do |f|

这将通过 ajax 提交表单。在您的控制器中,format.js在每个之后添加一行format.json

format.json { ... }
format.js

然后创建一个app/views/rules/create.js.erb(或haml)文件。在文件中,你可以添加任何你想要的js,所以添加以下内容

<% if @rule.errors.any? %>
  # add js here to append the errors in the page
<% else %>
  window.location.reload
<% end %>
于 2013-03-15T13:08:40.237 回答