繁体   English   中英

对在Ruby on Rails中嵌套感到沮丧

[英]Frustrated With Nesting in Ruby on Rails

这是我在这里的第一篇文章,老实说,我不会问很多问题,但是一段时间以来,涉及嵌套在Ruby on Rails中的事情一直困扰着我。

我有一个class Thought (属于成员的个人帖子),分页为@share_items 我包括一个“喜欢”按钮,该按钮将允许成员喜欢其他成员的帖子(例如Facebook)。 like按钮的class Opinion

到目前为止,我的代码:

Class Member
has_many :thoughts, dependent: :destroy
has_many :opinions, foreign_key: "fan_id", dependent: :destroy
has_many :fans, through: :opinions

Class Thought
belongs_to :member

has_many :opinions, foreign_key: "like_id", dependent: :destroy
has_many :likes, through: :opinions

validates :member_id, presence: true

Class Opinion
attr_accessible :like_id

belongs_to :fan, class_name: "Member"
belongs_to :like, class_name: "Thought"

validates :fan_id, presence: true
validates :like_id, presence: true

Member Model
def share
Thought.from_members_authenticated(self)
end

MemberPages Controller
def homepage
@share_items = registered_member.share.paginate(page: params[:page])
end

部分_share.html.erb

<% if @share_items.any? %>
<ol class="member_shares">
<%= render 'shared/share_item', collection: @share_items %>
</ol>
<%= will_paginate @share_items %>
<% end %>

呈现部分_share_item.html.erb

<li id="<%= share_item.id %>">
content...
<%= render 'thoughts/like_form' %>
...content
</li>

一切都进行得很顺利,直到我尝试在分页的@share_itemsclass Thought )内呈现thoughts/like_form形式。 (对我而言)它具有奇怪而无法解释的结果。 这是通往表格的代码。

Member Model

def liked?(random_thought)
opinions.find_by_like_id(random_thought.id)
end

def like!(random_thought)
opinions.create!(like_id: random_thought.id)
end

def unlike!(random_thought)
opinions.find_by_like_id(random_thought.id).destroy
end

OpinionsController

respond_to :html, :js

def create
@thought = Thought.find(params[:opinion][:like_id])
registered_member.like!(@thought)
respond_with @thought
end

def destroy
@thought = Opinion.find(params[:id]).like
registered_member.unlike!(@thought)
respond_with @thought
end
end

最后是thoughts/like_form形式:

<div id="like_form">
<% if registered_member.liked?(@thought) %>
<%= render 'thoughts/unlike' %>
<% else %>
<%= render 'thoughts/like' %>
<% end %>
</div>

这将使任何thoughts/unlike

<%= form_for(registered_member.opinions.find_by_like_id(@thought),
html: { method: :delete },
remote: true) do |f| %>
<%= f.submit "Unlike", class: "btn btn-small btn-default" %>
<% end %>

或: thoughts/like

<%= form_for(registered_member.opinions.build(like_id: @thought.id),
remote: true) do |f| %>
<div><%= f.hidden_field :like_id %></div>
<%= f.submit "Like", class: "btn btn-small btn-primary" %>
<% end %>

最后包含opinions/create.js.erb

$("#like_form<%= @thought.id %>").html("<%= escape_javascript(render('shared/unlike')) %>")
$("#likes").html('<%= @thought.likes.count %>')

opinions/destroy.js.erb

$("#like_form<%= @thought.id %>").html("<%= escape_javascript(render('shared/like')) %>")
$("#likes").html('<%= @thought.likes.count %>')

请注意,我对js做了一些可疑的事情...我试图说出类似形式来针对特定思想(成员的分享)。 注意:到目前为止,这是最成功的方法,但没有雪茄。 它将fan_id(成员)和like_id(思想)添加到数据库中,并呈现likely按钮。 但是它有无法预料的结果。 例如:有时,无论我喜欢哪个成员共享,它都会始终呈现页面的第一部分,尽管它会向数据库中添加正确的数据。 有时它会正常工作,但是刷新页面后,它将呈现“喜欢”按钮(即使当前被喜欢)或呈现正确的按钮,但是在尝试“不喜欢”共享时会引发错误说“ destroy / opinions”不匹配,这表明它没有针对特定的份额。

因此,我重申一下我的故意问题:当成员的UNIQUE共享( class Thought )在分页列表中定义为@share_items时,如何“成功”呈现一个类似按钮(带有class Opinion class Thought )。

抱歉,如果我感到困惑,我是第一次来这里,我是Ruby的新手。 感谢您提供的任何帮助。

嵌套对象后,应按以下方式声明表单:

form_for [@member, @opinion]

我想出了一种方法来成功呈现成员个人帖子的“喜欢/不喜欢”表单。 尽管这是不可思议的,但占用空间,最重要的是:缺乏趋势; 确实有效。

我没有呈现出like_form.html.erb ,而是直接将代码添加到share_item.html.erb并告诉表单不要查找@thought而是查找share_item (这是嵌套在其中的@share_items集合中的单个项) class Thought

thoughts/unlike.html.erb现在看起来像:

<%= form_for(registered_member.opinions.find_by_like_id(share_item),
html: { method: :delete },
remote: true) do |f| %>
<%= f.submit "Unlike", class: "btn btn-small btn-default" %>
<% end %>

thoughts/like.html.erb

<%= form_for(registered_member.opinions.build(like_id: share_item.id),
remote: true) do |f| %>
<div><%= f.hidden_field :like_id %></div>
<%= f.submit "Like", class: "btn btn-small btn-primary" %>
<% end %>

而且我可以从js中省略<%= @thought.id %> ,因此看起来像("#like_form")

就像我说的那样,这使我的部分工作不得不在其中添加代码,而不是将表单部分渲染,但是如果我做后者,则会收到以下错误:“ share_item是未知或未定义的局部变量”我的最初目标是使表格真正起作用,但我仍在寻求有关如何呈现表格的建议,而不是直接将其添加到我的部分表格中,而不会得到该错误消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM