【问题标题】:Using the id of a button to render a partial in Rails使用按钮的 id 在 Rails 中呈现部分
【发布时间】:2012-10-15 20:37:03
【问题描述】:

我有一个视图,其中显示用户创建的所有事件的列表的部分视图,旁边有一个编辑链接。我想要发生的是,当用户单击“编辑”时,下面会出现一个部分表单,以便您可以编辑该事件。

为简单起见,我设法让按钮的 id 与事件的 id 相同。所以,我想要发生的是,当单击 id 为 2 的按钮时,下面会出现一个表单来编辑 id 为 2 的事件。

我认为我需要进行某种 AJAX 调用来呈现部分内容,但我不知道该怎么做。任何帮助将不胜感激,谢谢。

到目前为止我所拥有的是(所有的编辑按钮都有一个 btn-info 类):

$(document).ready(function(){
    $('.btn-info').click(function(e){
        e.preventDefault;
        var btnID = this.id;
        //something here to get the partial to render 
    });
}); 

我可以使用类似下面的方法来调用部分吗?我知道这不起作用,但可能会更好地了解我想要实现的目标:

$("#events").html("<%= escape_javascript render( edit_event_path(btnID) ) %>");

更新:根据要求,控制器和视图:

事件控制器上的编辑操作:

def edit
    @event = Event.find(params[:id])

    respond_to do |format|
      format.html
      format.js
    end
end

项目显示完整的带有粘贴 javascript 的视图:

<script>
    $(document).ready(function(){
    $('#new-event-button').click(function(e){
        e.preventDefault();
        $('#edit-events').hide();
        $('#delete-events').hide();
        $('#new-event').slideDown(function(){
            $('html, body').animate({
            scrollTop: $(document).height()-$(window).height()},200,"linear"
            );
        });
    });
    $('#edit-events-button').click(function(e){
        e.preventDefault();
        $('#new-event').hide();
        $('#delete-events').hide();
        $('#edit-events').slideDown(function(){
            $('html, body').animate({
            scrollTop: $(document).height()-$(window).height()},200,"linear"
            );
        });
    });
    $('#delete-events-button').click(function(e){
        e.preventDefault();
        $('#new-event').hide();
        $('#edit-events').hide();
        $('#delete-events').slideDown(function(){
            $('html, body').animate({
            scrollTop: $(document).height()-$(window).height()},200,"linear"
            );
        });
    });
    $('.btn-info').click(function(e){
        e.preventDefault;
        $('#events-forms').after('<%= escape_javascript( render :partial => "eventform", :locals => { :event => @event } ) %>');
    });
});

</script>

<div class="content-box timeline-box">
<div id="my-timeline"></div><br /><br />
<br />

<button id="new-event-button" class="btn btn-success btn-large">New Event</button>
<button id="edit-events-button" class="btn btn-info btn-large">Edit Events</button>
<button id="delete-events-button" class="btn btn-danger btn-large">Delete Events</button>

<div id="events-forms">
    <div id="new-event">
        <%= render :partial => "new_event", :locals => { :event => Event.new(:timeline_id=>@timeline.id) } %>
    </div>

    <div id="edit-events">
        <%= render :partial => "edit_events", :locals => { :events => current_user.events } %>  
    </div>

    <div id="delete-events">
        <%= render :partial => "delete_events", :locals => { :events => current_user.events } %>        
    </div>
</div>

以及编辑事件的表单('_eventform.html.erb'):

<%= form_for(event) do |f| %>
  <% if event.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(event.errors.count, "error") %> prohibited this event from being saved:</h2>

      <ul>
      <% event.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <%=f.hidden_field 'timeline_id', :value => current_user.timeline.id %>
  <div class="field">
    <%= f.label :start_date %><br />
    <%= f.date_select :start_date %>
  </div>
  <div class="field">
    <%= f.label :headline %><br />
    <%= f.text_area :headline %>
  </div>
  <div class="field">
    <%= f.label :text %><br />
    <%= f.text_area :text %>
  </div>
  <div class="field">
    <%= f.label :media %><br />
    <%= f.text_area :media %>
  </div>
  <div class="field">
    <%= f.label :caption %><br />
    <%= f.text_area :caption %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

【问题讨论】:

    标签: javascript jquery ruby-on-rails partial renderpartial


    【解决方案1】:

    这是我在部分列表中要做的:

    <% @events.each do |event| %>
       <div id="event_<%= event.id">
          #... whatever event display code you use
          <%= link_to "edit", edit_event_path(event), :class => '.btn-info', :remote => true %>
       </div>
    <% end %>
    

    在您的控制器中:

    class EventsController < ApplicationController
    
      def edit
        @event = Event.find(params[:id])
        #.. whatever else you currently have here
    
        respond_to do |format|
          format.html
          format.js
        end
      end
    
    end
    

    然后,在新视图中 (app/views/events/edit.js.erb):

    $('#event_<%= @event.id %>').after('<%= escape_javascript( render :partial => "edit_events", :locals => { :event => @event } ) %>');
    

    【讨论】:

    • 我可能应该说 - 我正在使用项目显示视图来呈现事件 - 因此您可以在同一页面中创建新事件或编辑现有事件 - 它呈现部分这里。我现在已经将 javascript 粘贴到 project#show 视图的顶部(仅现在!)。因此,当我使用您的建议时,我收到此错误:'undefined local variable or method `event' for #:0x4295c70>'。它指的是“form_for(event) do”这一行。
    • 我该如何做相当于调用部分?: "edit_events", :locals => { :event => @event } %>跨度>
    • 我对上面的edit.js.erb 进行了编辑。让我知道这是否适用于您的表单。
    • 不幸的是没有,现在我收到此错误:NilClass:Class 的未定义方法`model_name'。它指的是这一行: 的形式是部分的。有什么想法!?
    • 您可以发布您的edit 控制器操作和部分事件表单吗?您是否能够自己呈现编辑操作(即,没有 javascript)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2015-05-22
    相关资源
    最近更新 更多