【问题标题】:The right place for the Js to render a partial in RailsJs 在 Rails 中渲染局部的正确位置
【发布时间】:2012-09-04 15:54:42
【问题描述】:

我的计划是通过 klick 事件更新部分内容,我通过 ajax 获取一些数据。 所以我打开了我的 assets/javascripts 目录并将代码放在我打算调用它的模块的 js 文件中。我设法获取数据并在 div 上调用一些“html() 或 text()”。但是当我尝试打电话时

.html("<%= escape_javascript( render( :partial => 'job') ) %>")

我的控制器告诉我未知方法“渲染”。所以我在许多其他威胁中表示资产目录不是为静态内容构建的。 但现在的问题是,如果不在资产中,该放在哪里? 我试图把它放在视图/模型文件夹中(与动作“显示”同名)。但它不会加载。是的,我在 show 动作中告诉 Controller 响应 format.js。

那么我应该把 js-File 放在哪里以及如何调用它呢?或者甚至有一种方法可以让它在资产目录中并且能够调用渲染?


感谢您的回答!可悲的是,我正是这样做的,但我不工作。所以这是我的代码:

/app/views/events/show.js.erb.coffee:

$(document).ready ->
  url = window.location
  url = String(url).split('/')
  event_id = url[$.inArray( "events" , url) + 1]
  $('.position').click ->
    position_id = $(this).attr("id")
    $.ajax '/events/'+event_id+'/eventpositions/'+position_id+'/eventjobs'
      dataType: 'json'
      success: (result)->
        $( '#'+position_id ).find('.jobs').html("<%= escape_javascript( render( :partial => 'job') ) %>")
        alert result[1].job_id

/app/views/events/show.html.haml:

%p#notice{:xmlns => "http://www.w3.org/1999/html"}= notice
%p
  %b Name:
  = @event.name
  \ 
  %b Plz:
  = @event.plz
%p
  %b Personal:
  - @eventpositions.each do |p|
    .position{:id => "#{p.id}"}
    %b
      Position: #{Position.find(p.position_id).name} Anzahl: #{p.quantity} Aufträge: #{p.eventjobs.all.count}
    .jobs

  = link_to 'Neuer Auftrag', new_event_eventposition_eventjob_path(@event.id,p.id)
  %br
  %br
= link_to 'Neue Position', new_event_eventposition_path(@event.id)
= link_to 'Edit', edit_event_path(@event)
|
\#{link_to 'Back', events_path}

/app/views/events/_job.html.haml:

.jobs
  - eventjobs.each do |j|
    User: #{User.find(Job.find(j.job_id).user_id).email}
    %br

/app/controllers/events_controller.rb:

def show
  @agency = Agency.find(current_agent.agency_id)
  @event = @agency.events.find(params[:id])
  @eventpositions = @event.eventpositions.all

  respond_to do |format|
    format.html # show.html.erb
    format.json { render json: @event }
    format.js
  end
end

所以代码在没有 Javascript 的情况下也可以工作。所有渲染都很好。但我现在的主要问题是,如果我将它放在 app/views/events 文件夹中,它甚至不会对点击事件做出反应。一旦我将它放在资产目录中,我就会像魅力一样工作,但不会渲染。 那么我错过了什么?为什么我的js代码没有加载?

非常感谢您的帮助!

【问题讨论】:

    标签: javascript ruby-on-rails ajax render renderpartial


    【解决方案1】:

    一般这种东西,我会把它命名为一个特定的动作,比如show.js.erb,然后使用你在控制器中的format.js。如果您使用的是 coffeescript,则需要将其命名为 show.js.coffee.erb。如果这不起作用,您可以在设置此 onclick 事件的位置发布您的视图代码吗?

    编辑以使用显示 javascript 代码

    因为你使用的是 show 动作,所以应该可以做到这一点:

    = link_to "Show", @event, :remote => true, :format => :js
    

    根据需要在那里调整事件变量,但它应该可以工作

    【讨论】:

    • 非常感谢您的回答!可悲的是,我确实这样做了,但它不起作用,很可能我错过了一些东西。
    • 仍然没有为我修复它。即使我将其更改为计划 .js 文件(或 js.erb),它也不会加载或对其执行任何操作。即使我尝试执行类似的操作: $('.position').click(function() { return alert ('Testing'); });什么可以告诉 RoR 不要加载它?
    • 更好地查看了您的代码,您要在哪里加载此 js 文件?你提到了一个点击事件,你能发布包含这个点击事件的代码吗?谢谢。
    • 我尝试用这个 /app/views/events/show.js.erb.coffee 加载它(参见下面的代码),但即使我只是在没有任何反应之前发布点击事件全部。所以我猜加载部分是问题!我在哪里告诉 Rails 在这一边包含这个 js?
    猜你喜欢
    • 1970-01-01
    • 2015-12-16
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    相关资源
    最近更新 更多