Javascript Rails 4在不重新加载页面的情况下更新实例变量

Javascript Rails 4在不重新加载页面的情况下更新实例变量,javascript,jquery,ruby-on-rails,ajax,ruby-on-rails-4,Javascript,Jquery,Ruby On Rails,Ajax,Ruby On Rails 4,有没有一种方法可以在视图中重新加载实例变量而不重新加载页面 我有一篇AJAX文章,它创造了一个新记录。我希望随后将该记录添加到现有实例变量中 所以我有一个动作,比如action,它处理我在action.html.erb中的视图: def action @variable = Variable.where().to_a end 然后我有一个AJAX请求,它执行一个动作,比如action2: def action2 @new_record = Variable.create(params)

有没有一种方法可以在视图中重新加载实例变量而不重新加载页面

我有一篇AJAX文章,它创造了一个新记录。我希望随后将该记录添加到现有实例变量中

所以我有一个动作,比如
action
,它处理我在
action.html.erb
中的视图:

def action
  @variable = Variable.where().to_a
end
然后我有一个AJAX请求,它执行一个动作,比如
action2

def action2
  @new_record = Variable.create(params)
  respond_to do |format|
    format.html
    format.json {render :json => @new_record.to_json}
  end
end
有没有办法刷新
@variable
实例变量以包含新创建的记录

我可以向
操作
发出另一个AJAX请求吗?如果是这样,我将如何在
操作
中检测AJAX请求

我已经用
request.xhr?
尝试过这个^^^^^,但是在我执行一个JS
之后,它抛出了一个奇怪的
标准错误

我不确定我是否朝着正确的方向前进,但如果我是,下面是我整理的所有代码

我正在构建一个即时消息服务,我承认我完全是在构建一个原型。我知道有更干净的方法来处理高流量负载,但我现在正在开发一个原型

视图代码如下所示。。。还有:在HTML聊天框中,我每2秒发出一个AJAX请求以查找新消息,在同一个函数中,我向上面我称之为
action
的内容发出AJAX请求(实际上命名了一些不同的内容),在“刷新”函数之后,我有一个
。单击()
函数以更新用户视图(刚刚提交的用户视图)

然后执行AJAX请求以获取最新消息(以便其他浏览器的查看者可以查看)的操作如下

def get
  @new_message = Message.where(["created_at > ?", Time.at(params[:last_message].to_i)]).first

  respond_to do |format|
    format.html
    # format.json {render json: @new_message}
    format.json {render :json => @new_message.to_json}
  end
end
更新

@eggroll建议使用下面的代码,但我遇到了引导问题


您可以使用success回调,并将div附加到$(“#chatbox”)中,下面是示例代码

jQuery.ajax({
    type: 'GET',
    url: loadUrl,
    data: dataString,
    dataType: 'html',
    success: function(response) {
        $("#chatbox").append("
        <div id="left-side">
        <p>Email:"+  response[:email]+"</p>
        <p>Message:"+ response[:message]+"</p>
      </div>"
    }
});    
jQuery.ajax({
键入:“GET”,
url:loadUrl,
数据:dataString,
数据类型:“html”,
成功:功能(响应){
$(“#聊天室”)。附加(“
电子邮件:“+回复[:电子邮件]+”

消息:“+响应[:消息]+”

" } });
您可以使用success回调,并将div附加到$(“#chatbox”)中,下面是示例代码

jQuery.ajax({
    type: 'GET',
    url: loadUrl,
    data: dataString,
    dataType: 'html',
    success: function(response) {
        $("#chatbox").append("
        <div id="left-side">
        <p>Email:"+  response[:email]+"</p>
        <p>Message:"+ response[:message]+"</p>
      </div>"
    }
});    
jQuery.ajax({
键入:“GET”,
url:loadUrl,
数据:dataString,
数据类型:“html”,
成功:功能(响应){
$(“#聊天室”)。附加(“
电子邮件:“+回复[:电子邮件]+”

消息:“+响应[:消息]+”

" } });
从您的代码开始,下面是我尝试的一个解决方案。我重命名了元素,希望它能使代码更加自我记录,从而让您更容易识别我所做的事情。它并不完美,但它在Chrome中对我有效,所以希望它能有所帮助。我假设开始的
聊天id
为1。如果我否则,您可以在控制器中的
get\u last\u chat\u id
方法中对其进行调整

(注意:有几行代码对您来说是多余的,但对我来说是必要的,我可以在我现有的应用程序中运行这些代码。您还应该知道我使用的是Postgres、jQuery、Desive、HAML和Bootstrap 4 alpha。)

app/controllers/messages\u controller.rb

class messages控制器
app/models/message.rb

class消息{order(created_at::desc)}
结束
db/migrate/20160717000100\u create\u messages.rb

class CreateMessages
app/assets/java
jQuery.ajax({
    type: 'GET',
    url: loadUrl,
    data: dataString,
    dataType: 'html',
    success: function(response) {
        $("#chatbox").append("
        <div id="left-side">
        <p>Email:"+  response[:email]+"</p>
        <p>Message:"+ response[:message]+"</p>
      </div>"
    }
});    
.
.
.

%head

  %meta{ charset: 'UTF-8' }
  %meta{ name: 'viewport', content: 'width=device-width, initial-scale=1, shrink-to-fit=no' }

  -# Derived from: http://v4-alpha.getbootstrap.com/getting-started/browsers-devices/
  %meta{ 'http-equiv' => 'X-UA-Compatible', content: 'IE=edge' }

  = csrf_meta_tags

  -# For page-specific meta tags
  = content_for?(:meta_tag) ? yield(:meta_tag) : ""

  %title Chatbox

  = stylesheet_link_tag 'application'
  = yield :page_stylesheet_link_tags

  = javascript_include_tag 'application'
  = yield :page_specific_javascript

.
.
.
- content_for :page_specific_javascript do
  = javascript_include_tag 'messages.js'

#chatbox
  %h1 Chatbox

  = link_to 'New Message', 'javascript:;', id: 'new-message-create-btn', class: 'btn btn-sm btn-primary'

  #new-message-form-wrapper.no-display
    = form_tag messages_path, id: 'new-message-form' do
      = hidden_field_tag 'new-message-email', @current_user_email
      #new-message-form-label-wrapper
        = label_tag 'new-message-text', 'Enter Your Message:'
      #new-message-form-text-wrapper
        = text_area_tag 'new-message-text', nil, rows: 6, cols: 70
      #new-message-form-buttons-wrapper
        = submit_tag 'Post Message', id: 'new-message-submit-btn', class: 'btn btn-sm btn-success'
        = link_to 'Cancel', 'javascript:;', id: 'new-message-cancel-btn', class: 'btn btn-sm btn-secondary'


  #display-messages-wrapper

    #messages-column-left.pull-md-left
      %h3 Messages From Others
      #messages-other-users

    #messages-column-right.pull-md-right
      %h3 My Messages
      #messages-current-user
.message-wrapper

  .message-attribution-wrapper
    %span.message-attribution-label Posted by:
    %span.message-attribution-text=email + ' on ' + message_created_at.strftime('%Y-%m-%d') + ' at ' + message_created_at.strftime('%I:%M:%S %p')

  .message-text-wrapper
    .message-label Message:
    .message-text= message_text
gem 'sass-rails', '~> 5.0' 
gem 'jquery-rails' 
gem 'jquery-ui-rails', '~> 5.0.5' 
gem 'autoprefixer-rails', '~> 6.3.6' 
gem 'bootstrap', '~> 4.0.0.alpha3'