如何使Javascript生成的复选框保持不变?
脚本中的“ajax”向服务器发送post或delete消息。包含ajax的javascript是添加复选框的内容。我们如何使创建的复选框元素持久化,以便用户刷新页面时它们仍然存在 habits/_-form.html.erb如何使Javascript生成的复选框保持不变?,javascript,ruby,ajax,checkbox,Javascript,Ruby,Ajax,Checkbox,脚本中的“ajax”向服务器发送post或delete消息。包含ajax的javascript是添加复选框的内容。我们如何使创建的复选框元素持久化,以便用户刷新页面时它们仍然存在 habits/_-form.html.erb <label id="<%= @habit.id %>" class="habit-id"> Missed: </label> <% @habit.levels.each_with_index do |level, index|
<label id="<%= @habit.id %>" class="habit-id"> Missed: </label>
<% @habit.levels.each_with_index do |level, index| %>
<% if @habit.current_level >= (index + 1) %>
<p>
<label id="<%= level.id %>" class="level-id"> Level <%= index + 1 %>: </label>
<%= check_box_tag nil, true, level.missed_days > 0, {class: "habit-check"} %>
<%= check_box_tag nil, true, level.missed_days > 1, {class: "habit-check"} %>
<%= check_box_tag nil, true, level.missed_days > 2, {class: "habit-check"} %>
</p>
<% end %>
<% end %>
class Habit < ActiveRecord::Base
belongs_to :user
has_many :comments, as: :commentable
has_many :levels
serialize :committed, Array
validates :date_started, presence: true
before_save :current_level
acts_as_taggable
scope :private_submit, -> { where(private_submit: true) }
scope :public_submit, -> { where(private_submit: false) }
attr_accessor :missed_one, :missed_two, :missed_three
def save_with_current_level
self.levels.build
self.levels.build
self.levels.build
self.levels.build
self.levels.build
self.save
end
def self.committed_for_today
today_name = Date::DAYNAMES[Date.today.wday].downcase
ids = all.select { |h| h.committed.include? today_name }.map(&:id)
where(id: ids)
end
def current_level_strike
levels[current_level - 1] # remember arrays indexes start at 0
end
def current_level
return 0 unless date_started
def committed_wdays
committed.map do |day|
Date::DAYNAMES.index(day.titleize)
end
end
def n_days
((date_started.to_date)..Date.today).count do |date|
committed_wdays.include? date.wday
end - self.missed_days
end
case n_days
when 0..9
1
when 10..24
2
when 25..44
3
when 45..69
4
when 70..99
5
else
6
end
end
end
遗漏:
=(指数+1)%>
级别:
0,{class:“习惯检查”}%>
1,{class:“习惯检查”}%>
2,{class:“习惯检查”}%>
习惯.js
$(文档).ready(函数(){
var handleChange=函数(){
习惯=$(this.parent().prev().attr(“id”);
level=$('label',$(this.parent()).attr(“id”);
如果($(this).is(“:checked”)){
$.ajax({
url:“/habits/“+habits+”/levels/“+level+”/days\u missed”,
方法:“员额”
});
}否则{
$.ajax({
url:“/habits/“+habits+”/levels/“+level+”/days\u missed/1”,
方法:“删除”
});
}
如果(!$('input[type=“checkbox”]:not(:checked),$(this.parent()).length){
/*这只是一个例子,你必须结束这个*/
$(this.parent().append($(“”));
$(this.parent().append($(“”));
$(this.parent().append($(“”));
$(“习惯检查”)。在('change',handleChange)上;
}
}
$(“习惯检查”)。在('change',handleChange)上;
});
习惯.rb
<label id="<%= @habit.id %>" class="habit-id"> Missed: </label>
<% @habit.levels.each_with_index do |level, index| %>
<% if @habit.current_level >= (index + 1) %>
<p>
<label id="<%= level.id %>" class="level-id"> Level <%= index + 1 %>: </label>
<%= check_box_tag nil, true, level.missed_days > 0, {class: "habit-check"} %>
<%= check_box_tag nil, true, level.missed_days > 1, {class: "habit-check"} %>
<%= check_box_tag nil, true, level.missed_days > 2, {class: "habit-check"} %>
</p>
<% end %>
<% end %>
class Habit < ActiveRecord::Base
belongs_to :user
has_many :comments, as: :commentable
has_many :levels
serialize :committed, Array
validates :date_started, presence: true
before_save :current_level
acts_as_taggable
scope :private_submit, -> { where(private_submit: true) }
scope :public_submit, -> { where(private_submit: false) }
attr_accessor :missed_one, :missed_two, :missed_three
def save_with_current_level
self.levels.build
self.levels.build
self.levels.build
self.levels.build
self.levels.build
self.save
end
def self.committed_for_today
today_name = Date::DAYNAMES[Date.today.wday].downcase
ids = all.select { |h| h.committed.include? today_name }.map(&:id)
where(id: ids)
end
def current_level_strike
levels[current_level - 1] # remember arrays indexes start at 0
end
def current_level
return 0 unless date_started
def committed_wdays
committed.map do |day|
Date::DAYNAMES.index(day.titleize)
end
end
def n_days
((date_started.to_date)..Date.today).count do |date|
committed_wdays.include? date.wday
end - self.missed_days
end
case n_days
when 0..9
1
when 10..24
2
when 25..44
3
when 45..69
4
when 70..99
5
else
6
end
end
end
类习惯{where(private_submit:true)}
作用域:public\u submit,->{where(private\u submit:false)}
属性访问器:错过一、错过二、错过三
def以当前级别保存
自建
自建
自建
自建
自建
自救
结束
def self.committed_for_today
today\u name=Date::DAYNAMES[Date.today.wday].downcase
ids=all.select{| h | h.committed.include?today_name}.map(&:id)
其中(id:ids)
结束
def当前_级别_罢工
级别[当前_级别-1]#记住数组索引从0开始
结束
def当前液位
返回0,除非日期\u已开始
def承诺日
已承诺。地图日期
日期::DAYNAMES.index(day.titleize)
结束
结束
定义n_天
((日期从开始到日期)…日期从今天开始)。计数日期
承诺的天数。包括?date.wday
结束-自我缺席日
结束
案件n_天
当0..9
1.
10时24分
2.
当25..44
3.
当45..69
4.
当70..99
5.
其他的
6.
结束
结束
结束
失去控制器的天数
class DaysMissedController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
def create
habit = Habit.find(params[:habit_id])
habit.missed_days = habit.missed_days + 1
habit.save!
level = habit.levels.find(params[:level_id])
level.missed_days = level.missed_days + 1
level.save!
head :ok # this returns an empty response with a 200 success status code
end
def destroy
habit = Habit.find(params[:habit_id])
habit.missed_days = habit.missed_days - 1
habit.save
level = habit.levels.find(params[:level_id])
level.missed_days = level.missed_days - 1
level.save!
head :ok # this returns an empty response with a 200 success status code
end
end
class DaysMissedController
以下是它的要点:
如果您需要任何进一步的解释、代码或图片,请告诉我:)最简单的方法是使用本地存储(存储在用户浏览器中)。这种特性存在于现代浏览器中,因此当您不需要支持传统浏览器时,它是最好的选择 使用起来也非常简单,只需设置和读取“localStorage”变量的属性即可:
# Set one value
localStorage.myapp_level1_flag1 = true;
# read the value
if (localStorage.myapp_level1_flag1) {
...
}
当然,您应该为变量指定有意义的名称。分配给localStorage的值将跨会话保存。还有一个变量“sessionStorage”,它只保存一个会话的数据
此外,数据由设置的域分隔。因此,域X无法访问域Y设置的数据
从IE8开始,本地存储基本上就得到了支持,并且与Cookie相比具有优势,即不会在每次请求时将数据传输到服务器。在本地存储存在之前,使用cookie的地方会增加一些性能开销
集成
我建议在代码中的两个位置集成本地存储(如果我正确理解您的JS大纲):
(当然,你会说,你对JS的理解不多,这使得
这件事要困难得多,因为解决方案完全取决于你
在浏览器端的本地存储上--但是您需要
从服务器端传输所有数据(这可能是必要的)
从长远来看,以防止数据重复)
第一个位置:创建复选框时(只是一个粗略的示例):
请查看此处以了解有关的更多信息。感谢Juergen提供的深思熟虑的解释:)我不知道如何将其与我提供的代码集成。你说它难以置信的简单,我希望你是对的。我把它放在习惯的顶端了吗?我不熟悉javascript的内部工作原理。这是一种我还没有自学的语言,但我希望在启动我的应用程序之前完成这一功能。我添加了一些粗略的集成提示。但是,如果您想将信息存储在服务器上并提取它,您也可能会考虑