1

これは私の最初の投稿であり、正直に言うと、私は多くの質問をする傾向はありませんが、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 を初めて使用するので、混乱していたら申し訳ありません。どうぞよろしくお願いいたします。

4

2 に答える 2

0

私は、メンバーの個々の投稿に対して、好きな/嫌いなフォームを正常にレンダリングする方法を見つけました。これはすごいことですが、スペースを消費し、何よりも次の点に注意してください。トレンドに欠けます。それ機能します。

render の代わりにlike_form.html.erb、コードを直接追加しshare_item.html.erb、フォームを探すので@thoughtはなく探すように指示しました (これは、ネストされた insideshare_itemのコレクション内の個々のアイテムです) 。@share_itemsclass 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 is an unknown or undefined local variable」というエラーが表示されますフォームを実際に機能させるという私の最初の目標は、そのエラーメッセージを表示せずに、フォームをパーシャルに直接追加するのではなく、フォームをレンダリングする方法についての提案をまだ求めています。

于 2012-10-06T20:17:29.383 に答える
0

ネストされたオブジェクトがある場合、次のようにフォームを宣言する必要があります。

form_for [@member, @opinion]
于 2012-10-05T22:35:23.057 に答える