Я пытаюсь перезагрузить часть, использованную в форме, чтобы обновить время, отображаемое в поле «время остановки» в представлении.
Я получаю ошибку при попыткеперезагрузить частичное на событие клика.
Я рассмотрел похожие вопросы, такие как: Частичное обновление Rails , на сайте SO, и мне не удалось устранить ошибку, когда я попытался применить ответы на другие вопросы.
Будем благодарны за любые комментарии или предложения, которые помогут устранить эту ошибку.
Заранее благодарен за вашу помощь.
Моя прикладная среда:
- Railsверсия 4.2.7.1
- Ruby версия 2.3.4-p301 (x86_64-linux)
- RubyGems версия 2.6.11
- JavaScript Runtime Node.js (V8)
Я определил действие «update_stoptime» в контроллере как:
class UsercatsController < ApplicationController
#######################################
# define action to update stop time
#######################################
def update_stoptime
@ustoptime = Time.current.strftime("%I:%M %p")
p 'print @ustoptime time value (Time.current) below for update_stoptime action in Usercats controller'
p @ustoptime
respond_to do |format|
format.js
end
end
# GET /usercats/new
def new
p 'current user ID for NEW action is:'
p current_user.id
@usercat = current_user.usercats.build
@ustoptime = Time.current.strftime("%I:%M %p")
p 'print @ustoptime time value below for new action in controller(Time.current)'
p @ustoptime
end
end
Часть сохраняется в папке «../views/stoptimes» как:
# _stoptime.html.erb
<div id='update_stoptime'>
<%= f.input :stoptime, required: true, input_html: {value: @ustoptime}, :label => "Stop Time:", :ampm => true %>
</div>
Часть отображается из файла, который сохранен в папке ../views/usercats как:
# _form.html.erb
<%= simple_form_for(@usercat) do |f| %>
<%= f.error_notification %>
<div class="form-inputs">
<%= render 'stoptimes/stoptime', f: f %>
</div>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
В папке ../views/usercats я использую следующую JS Coffeeфайл для перезагрузки частичного события click:
# app/views/usercats/update_stoptime.js.coffee
$("#update_stoptime").load("<%= j render partial: 'stoptimes/stoptime', locals: { f: f } %>");
Я обновил маршруты.RB-файл со строкой ниже:
get 'usercats/update_stoptime', as: 'update_stoptime'
И в папке "../app/assets/javascripts/" я создал файл JS Coffee с вызовом AJAX:
# stoptime.js.coffee
$ ->
$(document).on 'click', '#update_stoptime', (evt) ->
$.ajax 'update_stoptime',
type: 'GET'
dataType: 'script'
error: (jqXHR, textStatus, errorThrown) ->
console.log("AJAX Error: #{textStatus}")
success: (data, textStatus, jqXHR) ->
console.log("script loaded OK!")
Я перечислил ошибку ниже:
Started GET "/usercats/update_stoptime?_=1539021470900" for 104.194.218.93 at 2018-10-08 17:58:58 +0000
Processing by UsercatsController#update_stoptime as JS
Parameters: {"_"=>"1539021470900"}
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
"print @ustoptime time value (Time.current) below for update_stoptime action in controller"
"01:58 PM"
Rendered usercats/update_stoptime.js.coffee (45.7ms)
Completed 500 Internal Server Error in 53ms (ActiveRecord: 0.2ms)
ActionView::Template::Error (undefined local variable or method `f' for #<#<Class:0x007f736a255078>:0x007f7369f05698>):
1: # app/views/usercats/update_stoptime.js.coffee
2: $("#update_stoptime").load("<%= j render partial: 'stoptimes/stoptime', locals: { f: f } %>");
app/views/usercats/update_stoptime.js.coffee:2:in '_app_views_usercats_update_stoptime_js_coffee___2918126501527502339_70066841111240'
app/controllers/usercats_controller.rb:32:in 'update_stoptime'
##############################################################
Обновление, я добавилприведенная ниже информация использовалась для устранения ошибки при перезагрузке частичного события щелчка.
#####################################################################
Iрешил сохранить время остановки как символьное значение, основываясь на ответе @ IlyaKonyukhov.
Сначала я создал миграцию ниже, чтобы добавить переменную времени остановки символа в мою модель.
rails g migration add_cstoptime_to_usercat cstoptime:string
ДалееЯ обновил вызов AJAX в файле JS Coffee в папке "../app/assets/javascripts/", чтобы передать переменную экземпляра из контроллера в представление.
#stoptime.js.coffee
$ ->
$(document).on 'click', '#update_stoptime', (evt) ->
$.ajax 'update_stoptime',
type: 'GET'
dataType: 'script'
data: {
cstoptime: @ustoptime
}
error: (jqXHR, textStatus, errorThrown) ->
console.log("AJAX Error: #{textStatus}")
success: (data, textStatus, jqXHR) ->
console.log("script loaded OK!")
Далее я обновил 'новые действия 'и' update_stoptime 'в контроллере для выводастроковое значение для времени остановки.
class UsercatsController < ApplicationController
#######################################
# define action to update stop time
#######################################
def update_stoptime
@ustoptime = Time.current.strftime("%I:%M %p").to_s
p 'print @ustoptime time value (Time.current) below for update_stoptime action in Usercats controller'
p @ustoptime
respond_to do |format|
format.js
end
end
# GET /usercats/new
def new
p 'current user ID for NEW action is:'
p current_user.id
@usercat = current_user.usercats.build
@ustoptime = Time.current.strftime("%I:%M %p").to_s
p 'print @ustoptime time value below for new action in controller(Time.current)'
p @ustoptime
end
end
Далее я обновил партиал, сохраненный в папке "../views/stoptimes":
#app/views/stoptimes/_stoptime.html.erb
<input value="<%= @ustoptime %></input>
Далее я обновил JSКофейный файл для перезагрузки значения времени остановки для события щелчка:
# app/views/usercats/update_stoptime.js.coffee
$("#update_stoptime").val("<%= @ustoptime %>");
Далее я обновил форму, сохраненную в папке ../views/usercats:
# _form.html.erb
<%= simple_form_for(@usercat) do |f| %>
<%= f.error_notification %>
<%= f.input :cstoptime, :label => "Record stop time:",
input_html: {id: 'update_stoptime', :style => "width:110px", value: @ustoptime, class: "form-control"} %>
<div class="form-actions">
<%= f.button :submit %>
</div>
<% end %>
значение времени остановки началось автоматически обновляя событие click без каких-либо ошибок после того, как я внес изменения / обновления, которые я перечислил выше.
Спасибо @IlyaKonyukhov за ваши комментарии и предложения.