これは私の最初の投稿であり、正直に言うと、私は多くの質問をする傾向はありませんが、Ruby on Rails でのネストに関連して、かなり長い間、私を苛立たせていました。
としてページ付けされたclass Thought
(メンバーの個々の投稿) があり@share_items
ます。メンバーが他のメンバーの投稿 (Facebook など) に「いいね」できるようにする「いいね」ボタンを含めています。いいねボタンには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>
thoughts/like_form
ページ分割された@share_items
( ) 内のフォームをレンダリングしようとするまで、すべてがスムーズに進みますclass Thought
。それは(私にとって)奇妙で説明のつかない結果をもたらします。フォームに至るまでのコードは次のとおりです。
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 に怪しいことをしていることに注意してください... 特定の考え (メンバーのシェア) をターゲットにするように like フォームに指示しようとしています。注:これはこれまでのところ最も成功していますが、葉巻はありません. fan_id (メンバー) と like_id (考え) をデータベースに追加し、似ていないボタンをレンダリングします。しかし、それは予期しない結果をもたらします。例: ときどき、どのメンバーの共有が好きであっても、ページの最初の共有とは異なり、データベースに正しいデータが追加されますが、常にレンダリングされます。それ以外の場合は正しく機能しますが、ページを更新した後、いいねボタンをレンダリングするか (現在いいねされていたとしても)、正しいボタンをレンダリングしますが、共有を「いいね! 解除」しようとするとエラーが発生します。 「destroy /opinions」に匹敵するものはないと言っている
私の意図的な質問を繰り返します:として定義されたページ分割されたリスト内にある場合class Opinion
、メンバーの UNIQUE share () 内に( を使用して) いいね! ボタンを「正常に」レンダリングするにはどうすればよいでしょうか。class Thought
@share_items
初めてここに投稿し、Ruby を初めて使用するので、混乱していたら申し訳ありません。どうぞよろしくお願いいたします。