在轨道中使用ajax调用控制器

时间:2014-04-06 16:14:19

标签: ruby-on-rails ajax

在ruby on rails项目中,当我成功创建记者时,页面将重定向到另一个控制器的另一个动作;当页面重定向时,重新加载页面。在这个项目中,我有2个控制器:

reporters_controller.rb:

class ReportersController < ApplicationController
  layout "reporter"

  def new
    @reporter = Reporter.new
    @gomrokaddresses = Gomrokaddress.find(:all)
  end

  def create
    @reporter = Reporter.new(reporter_params)
    if @reporter.save
      #redirect_to new_reporter_path
      redirect_to new_problem_path(:id => @reporter.id)
    else
      @existreporter = Reporter.find_by(params[:rep_user_name])
      redirect_to new_problem_path(:id => @existreporter.id)
    end
  end

problems_controller.rb

def new
    @reporter = Reporter.find(params[:id])
    @problem = @reporter.problems.build
  end

  def create
    @reporter = Reporter.find(params[:id])
    @problem = @reporter.problems.build(problem_params)

    if @problem.save
      redirect_to new_problem_path(:id => @reporter.id)
    else
      redirect_to new_problem_path(:id => @reporter.id)
    end
  end

reporter.rb

class Reporter < ActiveRecord::Base
  has_many :problems
end

problem.rb

class Problem < ActiveRecord::Base
  belongs_to :reporter
end

我在视图中创建了form_for的记者和问题。当我在form_for中完成new.html.erb(对于记者)并提交时,将调用create action(存在于reporter_controller中),如果信息为true,则将页面重定向到/problems/new。由于这个redirect_to,页面重新加载;我不想重新加载页面,就在我创建记者时,记者的form_for替换为form_for问题。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

在你的控制器中试试这个

redirect_to new_problem_path(:id => @reporter.id), format: 'js'

希望这有帮助!

答案 1 :(得分:0)

默认情况下,控制器操作会呈现相应的视图模板。在这里,行动“问题#new”automatically renders“views / problems / new.html.erb”。

在您的代码中,您已重定向到new_problem_path表示的URL,并且对该URL的GET请求将路由到“problems#new”操作。因此,调用操作并加载其模板。

但是,如果要在不加载视图模板的情况下调用操作,则有override this default behavior的方法。

此外,redirect_to与AJAX不同。对于AJAX,您可以使用类似

的内容
def create
  ...
  respond_to do |format|
    if @reporter.save
      format.html { redirect_to ... }
      format.js
    else
      format.html { render action: ... }
      format.js
    end
  end
end

然后以用于创建新报告者的表单将:remote => true选项添加到form_for

但我不确定这是否会完成你想要做的事情。你能进一步解释一下你的问题吗?