在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
问题。我怎么能这样做?
答案 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
。
但我不确定这是否会完成你想要做的事情。你能进一步解释一下你的问题吗?