Rails控制器没有调用Javascript函数

时间:2017-12-14 10:26:31

标签: javascript ruby-on-rails ruby coffeescript

我需要一个我的Rails控制器在创建之后调用Javascript(Coffeescript)函数,以便传递创建的新对象的id。问题是永远不会调用该函数。

这里是控制器comments_controller.rb:

class CommentsController < ApplicationController
  def create
    newcomment = Comment.create!(comment: params[:comment], user_id: current_user.id, rutina_id: params[:id])
    respond_to do |format|
      format.js { render :js => "create_comment(" + newcomment.id.to_s + ");" }
    end
  end
  ...

我的CoffeeScript文件rutinas.js.coffee:

$ ->
  $('#dias').change ->
    ...

  $('#diasedit').change ->
    ...

  $('[id^="arrowUp"]').click ->
    ...

  $('[id^="arrowDown"]').click ->
    ...

  $('[id^="eliminar_com_"]').click ->
    ...

  $('[id^="editar_com_"]').click ->
    ...

  create_comment = (id) ->
    console.log(id)
    newComment = $('#com_model').clone();
    newComment.removeClass('hidden');
    newComment.find("td#content_com_model").html($('#comment').val());

    today = new Date();
    dd = today.getDate();
    mm = today.getMonth()+1;
    yyyy = today.getFullYear();
    if(dd<10)
      dd = '0'+dd
    if(mm<10)
      mm = '0'+mm
    today = yyyy + '-' + mm + '-' + dd;
    newComment.find("small#date_com_model").html(today);

    newComment.find("small#date_com_model")

    newComment.insertAfter($('#com_model'))


  $('#printBtn').click ->
    ...


  if document.getElementById("rutinas-list") != null
    i = 0
    while i < document.getElementById("rutinas-list").childElementCount
      i += 1
      do(i) ->
        ...

  cambia_voto =(element, cambio) ->
    ...


  $("#rutina_privacy_lvl").change ->
    ...

newcomment已成功创建,newcomment.id.to_s包含正确的值,我已经检查过它,但是从未到达console.log(id)。

更新

表单中设置了

remote: true。事实上,我已经测试了

respond_to do |format|
    format.js {
        logger.debug "create_comment(" + newcomment.id.to_s + ");"
        render :js => "create_comment(" + newcomment.id.to_s + ");"
    }
end

并且create_comment(41);已正确记录在ruby的终端

2 个答案:

答案 0 :(得分:0)

我认为你可能做错了。

你应该做的是使用AJAX创建注释(通过POST请求),然后使用AJAX的回调,如果请求成功执行你想要的JS函数并使用控制器返回的内容(通过format.json in控制器响应)。

请参阅https://coffeescript-cookbook.github.io/chapters/jquery/ajax

答案 1 :(得分:0)

当对动作create的请求是JS请求时,将执行来自控制器的代码:

format.js { render :js => "create_comment(" + newcomment.id.to_s + ");" }

如果您使用AJAX发送此请求,则可能的错误可能是dataType参数的错误值。你需要将它设置为&#34; script&#34;使这个JS工作。

如果你没有手动调用AJAX(使用remote: true),那么尝试在.js.erb模板中编写这个JS代码。