将实例变量传递给表单 - rails

Sor*_*00b 3 forms instance-variables ruby-on-rails-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变量_like.html.erb

我注意到类似形式的行为是/likes全面的.这只会在你在页面上时起作用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? %>
...
Run Code Online (Sandbox Code Playgroud)

路线到适当的形式:

#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>
Run Code Online (Sandbox Code Playgroud)

喜欢来自:

#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 %>
Run Code Online (Sandbox Code Playgroud)

来自个人资料(帖子的提要):

#views/users/show.html.erb
...
  <%= render @posts %>
...
Run Code Online (Sandbox Code Playgroud)

喜欢控制器:

#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
...
Run Code Online (Sandbox Code Playgroud)

用户模型:

#models/user.rb
...
  def like!(post)
    likes.create!(liked_post_id: post.id)
  end
...
Run Code Online (Sandbox Code Playgroud)

@ frank-blizzard指出我的表单标记是一个问题.在帖子的页面上生成的标记是:

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" value="73" /> 
Run Code Online (Sandbox Code Playgroud)

在Feed页面上:

<input id="like_liked_post_id" name="like[liked_post_id]" type="hidden" />
Run Code Online (Sandbox Code Playgroud)

tma*_*ini 8

你可以这样做:

<% form_for Like.new, :remote => true do |f| %>
<%= f.hidden_field :post_id, :value => @post.id %>
<%= f.submit %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

编辑

您可能需要将@post变量正确传递到_like_form部分中,如下所示:

#views/posts/_post.html.erb:
...
<% if signed_in? %>
  <%= render 'posts/like_form', :post => @post %>
<% end %>
...
Run Code Online (Sandbox Code Playgroud)

这将使您能够获得post部分内部的变量,因此您可以使用其id预填充表单值.看到这个问题也将变量传递给部分轨道3?并确保阅读如何正确地将变量传递给partials.您可以使用调试视图<%= debug <variablename> %>