【问题标题】:Rails showing series of objects with form_for and AjaxRails 使用 form_for 和 Ajax 显示一系列对象
【发布时间】:2013-09-13 00:34:18
【问题描述】:

我正在尝试显示“兴趣”列表,用户可以通过单击与兴趣图像相关联的按钮来“关注”这些“兴趣”。单击按钮以关注兴趣时,兴趣(及其相应的图像)应从列表中消失。

我在 create.js.erb 文件中使用了一个隐藏函数,该函数在单击关注按钮时由关系控制器调用,但该函数只会隐藏一系列兴趣中的第一个兴趣——而不是兴趣用户点击需要消失。所以必须有更好的方法来设置它,但我一辈子都无法弄清楚。这是我当前的设置:

我的控制器

class StaticPagesController < ApplicationController
  def home
    @user = current_user
    @city = request.location.city
    @interests = Interest.all
  end

首页

<%= render @interests %>

部分

<div id="follow_form">                      
<div class="four columns portfolio-item interests">
    <div class="our-work">
        <a class="img-overlay">
        <%= image_tag interest.image_path %>
            <div class="img-overlay-div">
            <h4><%= interest.name %></h4>
            </br>
            <h5>Placeholder
            </br>
            <%= interest.desc %></h5>
            <%= form_for(current_user.relationships.build(followed_id: 
                             interest.id), remote: true) do |f| %> 
                <div><%= f.hidden_field :followed_id %></div>
                <%= f.submit "I'm interested", class: "b-black" %>
            <% end %>
            </div>
        </a>
        <h3><a href="#"><%= interest.name %></a><span>features info</span></h3>
    </div>
   </div>
</div>

当您单击按钮时,关系控制器调用的 create.js.erb:

$("#follow_form").hide();

更新 这是用于进一步说明的关系控制器

def create
  @interest = Interest.find(params[:relationship][:followed_id])
  current_user.follow!(@interest)
  respond_to do |format|
      format.html { redirect_to(root_url) }
      format.js 
   end
end

【问题讨论】:

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


    【解决方案1】:

    您需要提供一些东西来区分同一页面上的不同“follow_forms”。否则,jQuery 将只选择第一个元素并仅删除该元素。

    如何做到这一点的一个想法是将“interest.id”附加到follow_form id的末尾

    将您的部分更新为这样(假设您的部分被调用并位于 /app/views/interests/_follow_form.html.erb:

    <div id="follow_form<%="#{interest.id} %>">                      
    <div class="four columns portfolio-item interests">
        <div class="our-work">
            <a class="img-overlay">
            <%= image_tag interest.image_path %>
                <div class="img-overlay-div">
                <h4><%= interest.name %></h4>
                </br>
                <h5>Placeholder
                </br>
                <%= interest.desc %></h5>
                <%= form_for(current_user.relationships.build(followed_id: 
                                 interest.id), remote: true) do |f| %> 
                    <div><%= f.hidden_field :followed_id %></div>
                    <%= f.submit "I'm interested", class: "b-black" %>
                <% end %>
                </div>
            </a>
            <h3><a href="#"><%= interest.name %></a><span>features info</span></h3>
        </div>
       </div>
    </div>
    

    这样,每个 follow_form 都会附加一个唯一的 ID。然后你可以遍历你的兴趣并像这样调用每个兴趣的部分:

    主页:

    <% @interests.each do |interest| %>
      <%= render 'interests/follow_form', :interest => interest %> 
    <% end %>
    

    create.js.erb

    $("#follow_form_<%= "#{@interest.id}" %>").hide())
    

    您的控制器操作可以保持不变。

    【讨论】:

    • 它已经在这样做了。我将把上面的代码粘贴到更新中。那不是问题。问题是 Ajax/Javascript 调用删除了系列中的第一个对象,而不是点击了“兴趣”。
    • 我明白了,是的,这可能是因为您现在有多个 id 为“follow_form”的元素,让我改一下答案,看看能不能帮到您
    • 感谢您的帮助,但这是我遇到的问题的一部分,反映了我对 Ruby 的理解不足。在我的控制器中,如何从一系列@interest 中调出类似interest.id 的单个实例变量? (不使用局部变量。)我尝试了这个非常相似的解决方案:stackoverflow.com/questions/8370591/… 但它也只删除了系列中的第一项。非常感谢任何指导!
    • @interests 是集合变量,所以基本上你想遍历它们,然后对每个兴趣本身进行部分调用,就像这样。 (我会在上面更新我的答案)
    • 耶!谢谢,@derekyau。您的 create.js.erb 代码需要稍作修改:$("#follow_form&lt;%="#{@interest.id}" %&gt;").hide(); 但现在效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-20
    相关资源
    最近更新 更多