从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。

+0

非常感谢!这真的有助于进一步澄清Nycen的评论,这正是我期待的。 – A21

+0

太棒了,我无法在回答问题时轻松编写代码。我可能会将“响应”重命名为“源”,以使其更加明确,但那只是我。 – Nycen

你期待你的成功处理程序能够访问@source_code就像一个 “show.html.erb” 视图会,但它不会那样工作。

当您使用ajax时,该方法从浏览器调用;它是您从服务器发送的一段代码,它仍然可以与它交互,但它无法访问控制器变量。

所以,你的show动作需要渲染你的处理器可以理解的东西,比如json。然后,通过阅读您的“回复”变量,您可以在成功时访问它。