从Rails控制器读取Rails控制器中的变量值
问题描述:
我有一个实例变量,我的Rails控制器中的@source_code想通过成功函数在我的Ajax响应中检索。我从我的index.html.erb文件调用了这个Ajax函数,它呈现一个show.html.erb文件。我想让我的文本区域打印出@ source_code.code的值。从Rails控制器读取Rails控制器中的变量值
SourcesController.rb
def show
Rails.logger.debug("REACHED: show >>")
@source_code = Source.find_by(id: params[:id])
Rails.logger.debug("REACHED: source_code >>" + @source_code.code.to_s)
@sources = Source.all
end
index.html.erb
function updateTextArea(source_id){
console.log(source_id);
$.ajax({
type: "GET",
url: "/sources/" + source_id,
data: {source_id: source_id},
success: function (response){
alert("Ajax success")
console.log("<%= @source_code %>");
editor.session.setValue("<%= @source_code %>");
},
error: function(){
alert("Ajax error!")
}
});
答
扩展在Nycen的答案,你首先要控制器处理Ajax请求并返回一个JSON响应:
def show
respond_to do |format|
format.json { render json: Source.find_by(id: params[:id]) }
end
end
PS:要注意这一点,它会发送所有来源记录的字段的下降电线。我在模型上调用slice
(请参阅ActiveRecord.slice())以限制JSON中返回的字段。
然后你JavaSript需要使用Ajax调用的JSON结果:
function updateTextArea(source_id){
console.log(source_id);
$.ajax({
type: "GET",
url: "/sources/" + source_id,
success: function (response){
alert("Ajax success")
console.log(response.code);
editor.session.setValue(response.code);
},
error: function(){
alert("Ajax error!")
}
});
这取决于你的路线是如何设置的,但应该没有必要设置data
财产Ajax调用。您的路线可能会将其从URL路径中提取出来:/sources/12345
。
请注意,此设置没有show.html.erb
。没有看法,你的控制器只返回JSON。
答
你期待你的成功处理程序能够访问@source_code就像一个 “show.html.erb” 视图会,但它不会那样工作。
当您使用ajax时,该方法从浏览器调用;它是您从服务器发送的一段代码,它仍然可以与它交互,但它无法访问控制器变量。
所以,你的show动作需要渲染你的处理器可以理解的东西,比如json。然后,通过阅读您的“回复”变量,您可以在成功时访问它。
非常感谢!这真的有助于进一步澄清Nycen的评论,这正是我期待的。 – A21
太棒了,我无法在回答问题时轻松编写代码。我可能会将“响应”重命名为“源”,以使其更加明确,但那只是我。 – Nycen