2013-03-15 104 views
0

这里是前提:在Rails 3中修改respond_to

我有一个叫做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') 

这只是加载从规则/ new.html形式。我的问题当我点击“保存规则”按钮时,它会重定向到/ rules URL,然后显示错误rs或说“规则保存成功”。我希望它不会重定向,并将错误显示在仪表板中...再次,不会重定向到/规则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代码是如何工作的摆弄,我只是不”不知道如何。

回答

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提交表单,并在规则保存时刷新页面。

UPDATE:快速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)文件。在文件中,你可以添加你要那么添加以下

<% if @rule.errors.any? %> 
    # add js here to append the errors in the page 
<% else %> 
    window.location.reload 
<% end %> 
+0

好吧任何JS,所以我从仪表板控制器中添加变量到规则创建规则控制器动作和使用您所提供的代码。重定向工作非常感谢!但是,由于它创建了一个新的HTTP请求并刷新回主仪表板索引,我失去了通过jQuery.load AJAX调用添加的表单。 我想也许你最后的建议可能是最好的。不知道该怎么去做。 – 2013-03-15 13:21:15

+0

我已经添加了一个快速js解决方案。希望你可以找出其他的:) – jvnill 2013-03-15 13:26:33

+0

嗯,我认为这是正确的轨道。它现在通过AJAX提交,但我没有收到任何错误或成功消息,也没有将数据保存到数据库。 – 2013-03-15 13:36:56