如何使Javascript生成的复选框保持不变?

如何使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|

脚本中的“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| %>
  <% 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的内部工作原理。这是一种我还没有自学的语言,但我希望在启动我的应用程序之前完成这一功能。我添加了一些粗略的集成提示。但是,如果您想将信息存储在服务器上并提取它,您也可能会考虑