动态更改Rails中的Div内容4.1.4

时间:2014-08-18 03:18:22

标签: javascript jquery ruby ajax ruby-on-rails-4

我几乎花了一整天的时间试图弄清楚如何解决这个难题但不幸的是,我发现的大部分解决方案都与过时的Rails版本相关,但仍然允许"呈现& #34;用于资产。

以下是我要做的事情:
我的观点发现每个" Trip"输入并在页面上显示每个缩略图。当用户点击每个缩略图时,我希望在这些缩略图下面的Div中呈现其他细节(以及关联,每个行程都有一个has_many:周)(替换之前的内容)。

我似乎无法让Ajax工作,经过几个小时的尝试终于了解到#34;渲染"不能用于资产。我真诚地感谢任何帮助以及潜在的解决方案,如果有人可以提供Ajax与Rails 4的可能参考指南,这将非常棒,因为我似乎无法找到它。

这是我的代码:

查看 - index.html.erb

<div>
<ul class="thumbnails col-md-offset-2">
    <% Trip.find_each do |trip| %>
    <li class="col-md-3" style="list-style-type:none;">
        <%= link_to image_tag("http://placehold.it/350x350", :border => 0), :class => 'thumbnail', :url=>'/trips/selected_trip/params', :remote => true %>
        <h3><%= trip.name %></h3>
    </li>
    <% end %>
</ul>
    <div id="selected_trip">
    </div>
</div>

Controller - trips.controller.rb

class TripsController < ApplicationController
before_filter :authenticate_user!
after_action :verify_authorized

def index
    @trips = Trip.all
    authorize Trip
end

def new
    @trip = Trip.new
    authorize Trip
end

def create
    @trip = Trip.new(trip_params)
    authorize Trip

    if @trip.save
        flash[:notice] = "New trip has been created."
        redirect_to @trip
    else
        #Fill me in
    end
end

def edit
    @trip = Trip.find(params[:id])
    authorize Trip
end

def update
    @trip = Trip.find(params[:id])
    authorize Trip
    @trip.update(trip_params)
    flash[:notice] = "Trip has been updated."
    redirect_to @trip
end

def show
    @trip = Trip.find(params[:id])
    authorize Trip
end

def destroy
    @trip = Trip.find(params[:id])
    authorize Trip
    @trip.destroy

    flash[:notice] = "Trip has been deleted."

    redirect_to trips_path
end

def selected_trip
  @trip = Trip.find(params[:id])
  @trip.name

  respond_to do |format|
    format.js
  end
end
end

private
    def trip_params
        params.require(:trip).permit(:name, :description, :status)
    end
end

Javascript - trips.js.erb(我知道这种方法不再适用于渲染在资源中不可用)

$('#selected_trip').html("<%= escape_javascript(render :partial => 'selected_trip', :content_type => 'text/html'%>")

部分 - _selected_trip.html.erb

<p>Success!</p> <!-- Just for testing, will replace with actual content -->

谢谢, 内特

编辑11:10 PM(它有效) - 我已将控制器更改为:

def selected_trip
  @trip = Trip.find(params[:id])
  authorize Trip
  render :partial => 'selected_trip', :content_type => 'text/html'
end

和我的观点:

<div>
<ul class="thumbnails col-md-offset-2">
    <% Trip.find_each do |trip| %>
    <li class="col-md-3" style="list-style-type:none;" data-tripID="<%= trip.id %>">
        <%= link_to image_tag("http://placehold.it/350x350", :border => 0), selected_trip_trip_path(trip), :class => 'thumbnail', :remote => true %>
        <h3><%= trip.name %></h3>
    </li>
    <% end %>
</ul>
    <div id="selected_trip">
    </div>
</div>
</div>
<script>
$('a.thumbnail').on('ajax:success', function(evt, data) {
  var target = $('#selected_trip');
  $(target).html(data);
});
</script>

1 个答案:

答案 0 :(得分:2)

如果您想避免从资产中渲染,可以尝试这样做。

我假设您知道在哪里需要放置侦听器以捕获AJAX调用,并且您还可以弄清楚,当AJAX返回成功状态时,您希望将结果放在何处。然后,你想做这样的事情:

$('whatever_container_they_can_click').on('ajax:success', function(evt, data) {
  var target = $('#selected_trip'); // Find where is the destination
  $(target).html(data);
});

将您的控制器操作更改为:

def selected_trip
  @trip = Trip.find(params[:id])
  render :partial => 'selected_trip', :content_type => 'text/html'
end