ruby-on-rails – Rails创建方法创建重复项
我的应用程序中有一个待办事项列表功能,每次尝试输入时都会创建重复的任务. (您可以使用用户名’test@test.com’和密码’password’在
https://www.thestaysanemom.com/tasks处查看错误.)
该应用程序使用ajax来运行,我只能想象它会导致错误. create方法如下: def create @task = Task.new(task_params) @task.user_id = current_user.id if @task.save respond_to do |format| format.js format.html end else render :new end end 这是所有发生的视图: <% if current_user %> <div class="container"> <div class="row"> <div class="col-xs-12 col-md-6 col-lg-12"> <div class="content-box to-do"> <h2 class="font-script text-center">One-Time Tasks</h2> <p class="text-center">These tasks are here to stay,until you complete them.</p> <div id="onetime-todo"><%= render partial: 'items',locals: { task: @one_time } %></div> <div id="onetime-done"><%= render partial: 'done',locals: { task: @one_time_done } %></div> </div> <!-- content box --> </div> <!-- col --> <div class="col-xs-12 col-md-6 col-lg-4"> <div class="content-box to-do"> <h2 class="font-script text-center">Daily</h2> <p class="text-center">These automatically uncheck at night so you have a fresh list in the morning.</p> <div id="daily-todo"><%= render partial: 'items',locals: { task: @daily } %></div> <div id="daily-done"><%= render partial: 'done',locals: { task: @daily_done } %></div> </div> <!-- content box --> </div> <!-- col --> <div class="col-xs-12 col-md-6 col-lg-4"> <div class="content-box to-do"> <h2 class="font-script text-center">Weekly</h2> <p class="text-center">These automatically uncheck Sunday night so you get a new list each Monday morning.</p> <div id="weekly-todo"><%= render partial: 'items',locals: { task: @weekly } %></div> <div id="weekly-done"><%= render partial: 'done',locals: { task: @weekly_done } %></div> </div> <!-- content box --> </div> <!-- col --> <div class="col-xs-12 col-md-6 col-lg-4"> <div class="content-box to-do"> <h2 class="font-script text-center">Monthly</h2> <p class="text-center">These automatically uncheck on the last day of the month so you start with a clean list each 1st.</p> <div id="monthly-todo"><%= render partial: 'items',locals: { task: @monthly } %></div> <div id="monthly-done"><%= render partial: 'done',locals: { task: @monthly_done } %></div> </div> <!-- content box --> </div> <!-- col --> </div> <!-- row --> </div> <!-- container --> <% end %> <!-- current_user --> <script> $(document).ready(function() { $('.content-box').matchHeight(); }); </script> 这是我的create.js.erb: $("#onetime-todo").html("<%= escape_javascript(render partial: 'items',locals: { task: @one_time }) %>") $("#onetime-done").html("<%= escape_javascript(render partial: 'done',locals: { task: @one_time_done }) %>") $("#daily-todo").html("<%= escape_javascript(render partial: 'items',locals: { task: @daily }) %>") $("#daily-done").html("<%= escape_javascript(render partial: 'done',locals: { task: @daily_done }) %>") $("#weekly-todo").html("<%= escape_javascript(render partial: 'items',locals: { task: @weekly }) %>") $("#weekly-done").html("<%= escape_javascript(render partial: 'done',locals: { task: @weekly_done }) %>") $("#monthly-todo").html("<%= escape_javascript(render partial: 'items',locals: { task: @monthly }) %>") $("#monthly-done").html("<%= escape_javascript(render partial: 'done',locals: { task: @monthly_done }) %>") $('#textField').val(""); 哪个呈现_items.html.erb: <div class="to-do-list taskWrapper" data-url="<%= sort_tasks_path %>"> <% task.each do |task| %> <div id="<%= dom_id(task) %>"> <%= link_to task do %> <p> <%= fa_icon "bars",class: "color-neutral-light",style: "margin-right: 5px;" %> <%= link_to check_task_path(task),method: :post,remote: true do %> <%= fa_icon "square-o",style: "margin-right: 5px;" %> <% end %> <span id="task-show-hide"> <span class="font-serif"> <%= task.name %> </span> <span> <%= link_to task_path(task),method: :delete,remote: true do %> <%= fa_icon "remove",id: (task.id.to_s + "task"),style: "margin-left: 5px" %> <% end %> </span> </span> </p> <% end %> <!-- dom id wrapper --> </div> <% end %> <!-- task each --> </div> <script> $(document).on('ready page:load',function() { $('.content-box').matchHeight(); $(".taskWrapper").sortable({ update: function(e,ui) { var $that = $(e.target); Rails.ajax({ url: $(this).data("url"),type: "PATCH",data: $that.sortable('serialize'),}); console.log(ui.item.index()) } }); }); </script> 而且我认为这不重要,但为了完成起见,这里是任务的架构. create_table "tasks",force: :cascade do |t| t.string "name" t.string "frequency" t.boolean "completed",default: false t.integer "user_id" t.datetime "created_at",null: false t.datetime "updated_at",null: false t.integer "position" t.index ["user_id"],name: "index_tasks_on_user_id" end 任何人都可以看到为什么这会产生重复? 附加信息:ERB表格创建 <%= simple_form_for(@create_task,remote: true) do |f| %> <div class="row padded"> <div class="col-xs-12 col-sm-9"> <%= f.text_field :name,id: "textField",placeholder: "What needs to get done?",class: "form-control" %> </div> <div class="col-xs-12 col-sm-3"> <%= f.select :frequency,options_for_select([["One-Time","OneTime"],["Daily","Daily"],["Weekly","Weekly"],["Monthly","Monthly"]]),{},{class: "form-control"} %> </div> <div class="container text-center"> <div class="half-buffer"></div> <%= f.button :submit,class: "btn btn-outline-secondary" %> <div class="half-buffer"></div> </div> </div> <!-- row --> <% end %> 附加信息 根据要求,这是我在application.js.erb中的必需声明: //= require jquery //= require jquery_ujs //= require bootstrap //= require popper //= require magnific-popup //= require jquery-ui //= require froala_editor.min.js //= require plugins/align.min.js //= require plugins/char_counter.min.js //= require plugins/code_beautifier.min.js //= require plugins/code_view.min.js //= require plugins/colors.min.js //= require plugins/font_size.min.js //= require plugins/fullscreen.min.js //= require plugins/image.min.js //= require plugins/image_manager.min.js //= require plugins/inline_style.min.js //= require plugins/line_breaker.min.js //= require plugins/link.min.js //= require plugins/lists.min.js //= require plugins/paragraph_format.min.js //= require plugins/paragraph_style.min.js //= require plugins/quote.min.js //= require plugins/special_characters.min.js //= require plugins/url.min.js **加入徽章** source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.5.0' gem 'rails','~> 5.2.0' gem 'puma','~> 3.11' gem 'puma_worker_killer' gem 'sass-rails','~> 5.0' gem 'uglifier','>= 1.3.0' gem 'coffee-rails','~> 4.2' gem 'jbuilder','~> 2.5' gem 'mini_magick' gem 'jquery-rails' gem 'devise' gem 'bootsnap' gem 'bootstrap','~> 4.1.3' gem 'jquery-ui-rails' gem 'sprockets-rails' gem 'bootstrap-sass' gem 'bcrypt','~> 3.1.7' gem 'friendly_id','~> 5.2.0' gem 'stripe' gem 'figaro' gem 'magnific-popup-rails','~> 1.1.0' gem 'simple_form' gem 'acts-as-taggable-on','~> 6.0' #must be this version for Rails5 gem 'aws-sdk','~> 3' gem 'aws-sdk-s3',require: false gem 'simple_form_extension' gem 'recaptcha',require: "recaptcha/rails" gem 'font-awesome-rails' gem 'trix-rails',require: 'trix' gem 'rack-tracker' gem 'high_voltage','~> 3.1' gem 'convertkit-ruby',require: 'convertkit' gem 'dotenv-rails' gem 'acts_as_list' gem 'wysiwyg-rails' gem 'font-awesome-sass' gem 'will_paginate' group :production do gem 'pg','~> 0.20.0' end group :development,:test do gem 'byebug',platforms: [:mri,:mingw,:x64_mingw] gem 'sqlite3' end group :development do gem 'web-console','>= 3.3.0' gem 'listen','>= 3.0.5','< 3.2' gem 'spring' gem 'spring-watcher-listen','~> 2.0.0' gem 'binding_of_caller' gem 'better_errors' end group :test do gem 'capybara','>= 2.15','< 4.0' gem 'selenium-webdriver' gem 'chromedriver-helper' end gem 'tzinfo-data',platforms: [:mingw,:mswin,:x64_mingw,:jruby] 解决方法
您的rails代码看起来很好,但是当您提交时,您的表单会被双重提交.您应该可以在Chrome开发工具中看到这一点,如下所示.
这两个引用都指向application.js文件,但不同的行.很难说哪些库正在捕获提交,因为文件是连接的,不包括调试信息.如果没有看到你正在使用的JS文件(来自application.js),我猜想你可能同时拥有rails-ujs&包含jquery_ujs导致双重提交. 请在此处查看相关问题和答案:Form submitted twice,due to :remote=>true 更新:你肯定有两个rails-ujs& jquery_ujs出现在已编译的JS文件中.我认为这是个好看的地方.如果你使用的是Rails 5并使用jquery-rails gem,你可能会看到这里:https://github.com/rails/jquery-rails#installation If you are running Rails 5.1 and up,and if you have included //= require rails-ujs,then jquery_ujs is not needed anymore 您只需要从app / assets / javascripts / appplication.js文件中删除// = require jquery_ujs行 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |