Ruby on Rails - ошибка при повторной загрузке частичного события клика - PullRequest
0 голосов
/ 09 октября 2018

Я пытаюсь перезагрузить часть, использованную в форме, чтобы обновить время, отображаемое в поле «время остановки» в представлении.

Я получаю ошибку при попыткеперезагрузить частичное на событие клика.

Я рассмотрел похожие вопросы, такие как: Частичное обновление 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 за ваши комментарии и предложения.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Ну, сообщение об ошибке undefined local variable or method `f' ясно указывает на проблему.

В ответ на AJAX-запрос 'usercats / update_stoptime' сервер обрабатывает этот шаблон:

# app/views/usercats/update_stoptime.js.coffee
$("#update_stoptime").load("<%= j render partial: 'stoptimes/stoptime',  locals: { f: f } %>");

Переменная f в выражении ERB является локальной, она не определена в этом шаблоне.Вот почему это вызывает ошибку.

Перемотка этого сценария туда, где эта переменная была определена для обычного GET-запроса, приводит нас к шаблону _form.html.erb, где она задается как параметр блока для формы @usercat,Для вашего AJAX-вызова @usercat также не определено.

Я бы порекомендовал переписать _stoptime.html.erb шаблон и заменить f.input на обычный text_field_tag (или time_field_tag?).В вашем случае значение определяется отдельно через переменную @ustoptime, которая устанавливается в обоих методах контроллера для обычных и AJAX-вызовов.Таким образом, единственная переменная f, добавленная к вашему частичному имени, - это имя тега input.Вы можете следить за ним, используя обычный GET-запрос к текущей базе кода.

0 голосов
/ 09 октября 2018

попробуйте изменить это значение на:

$ ("# update_stoptime"). Html ("<% = escape_javascript (визуализировать частично: 'stoptimes / stoptime', locals: {f: f})%>«);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...