我需要一个我的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的终端
答案 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代码。