【问题标题】:Rails - How to access index value in partialRails - 如何访问部分索引值
【发布时间】:2018-10-03 01:58:52
【问题描述】:

我正在尝试在用户填写表单后使用内置的 rails ajax 将项目附加到列表中 - 但是,我无法定位 div 标签以将新条目附加到:ActionView::Template::Error (undefined local variable or method 'index'

客户/索引:

<% @clients.each_with_index do |client, index| %> 
  <div id="communication_pane<%= index %>">
    <%= render client.communications.order(created_at: :desc) %>
  </div>

  <%= form_for([@clientlist, client, client.communications.build], remote: true) do |f| %>
  <%= f.text_area :content, class: "form-control", id: "communication_content#{index}" %>
  <%= f.submit("New Communication") %>
<% end %>

通讯/create.js.erb:

$('#communication_pane<%= index %>').prepend('<%= escape_javascript(render @communications) %>');

如何从 Clients/Index 访问索引值?

【问题讨论】:

    标签: ruby-on-rails ajax ruby-on-rails-5 partial-views renderpartial


    【解决方案1】:

    在您的create.js.erb 中,$('#communication_pane&lt;%= index %&gt;') 处有一个未定义的变量index
    因为服务器无法知道您单击客户端的位置,因此您必须明确告知服务器。这是一个想法:

    <!-- app/views/clients/index.html.erb -->
    <% @clients.each_with_index do |client, index| %> 
      <div id="communication_pane<%= index %>">
        <%= render client.communications.order(created_at: :desc) %>
      </div>
    
      <%= form_for([@clientlist, client, client.communications.build], remote: true) do |f| %>
        <%= f.text_area :content, class: "form-control", id: "communication_content#{index}" %>
        <!-- Letting server know the index of current form by adding a param -->
        <%= hidden_field_tag :client_index, index %>
        <%= f.submit("New Communication") %>
      <% end %>
    <% end %>
    

    然后在您的js.erb 文件中,使用params[:client_index] 而不是index

    # app/views/communications/create.js.erb
    $('#communication_pane<%= params[:client_index] %>')
      .prepend('<%= escape_javascript(render @communications) %>');
    

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      我认为您必须将index 变量作为hidden_field 传递给您的控制器操作,然后将其显示在create.js.erb

      客户/索引:

      <% @clients.each_with_index do |client, index| %> 
        <div id="communication_pane<%= index %>">
          <%= render client.communications.order(created_at: :desc) %>
        </div>
      
        <%= form_for([@clientlist, client, client.communications.build], remote: true) do |f| %>
        <%= f.hidden_field :index, value: index %>
        <%= f.text_area :content, class: "form-control", id: "communication_content#{index}" %>
        <%= f.submit("New Communication") %>
      <% end %>
      

      communications_controller

      def create
        @index = params[:communication][:index]
        ...
      end
      

      通讯/create.js.erb

      $('#communication_pane<%= @index %>').prepend('<%= escape_javascript(render @communications) %>');
      

      【讨论】:

        猜你喜欢
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 2014-12-05
        • 2021-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多