Javascript Rails 4在不重新加载页面的情况下更新实例变量
有没有一种方法可以在视图中重新加载实例变量而不重新加载页面 我有一篇AJAX文章,它创造了一个新记录。我希望随后将该记录添加到现有实例变量中 所以我有一个动作,比如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)
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'