3

これは、Rails とモデル全体で変数を使用する方法についての私の最小限の理解によるエラーである可能性があります。そのため、それに答えるためにさらにコードが必要な場合、または私の用語が間違っている場合は、お知らせください。喜んで質問を更新します。

ユーザーが「いいね」できるようにしたい投稿のフィードがあります。次のコードでは、投稿のフィードを含む個々の投稿のページで「いいね!」を使用できますがsite.com:3000/posts/*post.id*like[liked_post_id]:*post.id*プロファイルで「いいね!」を送信しようとすると、フォーム データが渡されますが、渡されるフォーム データは(空白です。価値)site.com:3000/users/*user.id*like[liked_post_id]:

投稿のフィード内の投稿の ID をliked_post_id変数 inに渡すにはどうすればよい_like.html.erbですか?

/likeslike フォームのアクションが軒並みあることに気付きました。これは、ページにいるときにのみ機能しますsite.com:3000/posts/*post.id*か? /posts/*post.id*/likesあなたがページにいるときにフォームのアクションが行われるように、それを変更する必要があるかどうか興味がありますsite.com:3000/users/*user.id*

私の投稿ビューから:

#views/posts/_post.html.erb:
...
  <%= render 'posts/like_form' if signed_in? %>
...

適切なフォームへのルーティング:

#views/posts/_like_form.html.erb:
  <div id="like_form">
  <% if current_user.likes_this?(@post) %>
    <%= render "posts/unlike" %>
  <% else %>
    <%= render "posts/like" %>
  <% end %>
  </div>

からのように:

#views/posts/_like.html.erb
  <%= form_for Like.new, :remote => true do |f| %>
    <%= f.hidden_field :liked_post_id, :value => @post.id %>
    <%= f.submit "Like" %>
  <% end %>

プロフィールから (投稿のフィード):

#views/users/show.html.erb
...
  <%= render @posts %>
...

好きなコントローラー:

#controllers/likes_controller.rb    
  class LikesController < ApplicationController
  before_filter :signed_in_user

  def create
    @post = Post.find(params[:like][:liked_post_id])
    current_user.like!(@post)
    respond_to do |format|
      format.html { redirect_to root_url }
      format.js
    end
  end
...

ユーザーモデル:

#models/user.rb
...
  def like!(post)
    likes.create!(liked_post_id: post.id)
  end
...

@frank-blizzard は、私のフォーム マークアップに問題があると指摘しました。投稿のページで生成されるマークアップは次のとおりです。

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" value="73" /> 

フィードページで:

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" />
4

1 に答える 1

8

次のようなことができます。

<% form_for Like.new, :remote => true do |f| %>
<%= f.hidden_field :post_id, :value => @post.id %>
<%= f.submit %>
<% end %>

current_user.likes.build(...)パーツはビューの外に出て、コントローラーの中に入る必要があります。メソッドを使用しているcurrent_user.like!ので、これを達成するためにユーザーモデルにすでにいくつかのメソッドを実装していると思います。createあなたがアクセスできるLikesControllerのアクションで好きなようにビルドしない場合params[:like]

  def create
    @post = Post.find(params[:like][:post_id])
    current_user.likes.build(@post)
    # ...
  end

編集

次のように、@post 変数を _like_form パーシャルに正しく渡す必要がある場合があります。

#views/posts/_post.html.erb:
...
<% if signed_in? %>
  <%= render 'posts/like_form', :post => @post %>
<% end %>
...

これによりpost、パーシャル内の変数にアクセスできるようになるため、フォームの値にその ID を事前に入力できます。この質問も参照してください変数を部分的な Rails 3 に渡しますか? 変数をパーシャルに正しく渡す方法を必ず読んでください。を使用してビューをデバッグできます<%= debug <variablename> %>

于 2013-02-13T13:47:27.147 に答える