Js在Rails中渲染局部的正确位置

时间:2012-09-11 16:54:45

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

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

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

我的控制器告诉我未知方法“渲染”。所以我在许多其他威胁中都认为资产目录不是为静态内容构建的。 但现在问题是,如果不是资产,应该把它放在哪里? 我试图将它放在view / model文件夹中(与aktion'show'同名)。但它不会加载。是的我在show action中告诉控制器,以回复format.js。

那么我应该在哪里放置js-File以及如何调用它?或者是否有一种方法可以将它放在assets-directory中并且可以调用render?


感谢您的回答!可悲的是,我确实做到了,但我没有工作。所以这是我的代码:

/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文件夹中,它甚至不会对点击事件做出反应。一旦我将它放在assets目录中,我就像一个魅力,但不会渲染。 那我错过了什么?为什么我的js Code没有加载?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

一般来说,对于这种事情,我会将其命名为特定操作,例如show.js.erb,然后在控制器中使用format.js。如果您使用的是coffeescript,则需要将其命名为show.js.coffee.erb。如果这不起作用,您可以发布设置此onclick事件的视图代码吗?

使用show javascript代码进行编辑

因为你正在使用show动作,所以应该能够这样做:

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

根据需要调整事件变量,但它应该可以正常工作