2

我是 Rails 新手,在 Michael Hartl 的 Rails 4 教程http://ruby.railstutorial.org/chapters/following-users#sec-following_and_followers_pages的帮助下做一个项目, 同时为关注用户创建表单,它显示第一个参数在表单中不能包含 nil 或在 rails 4 中为空

    <%= form_for(current_user.relationships.find_by(followed_id: @user.id)) do |f| %>
    <div>
    <%= f.hidden_field :followed_id %>
    </div>
    <%= f.submit "Follow", class:"btn btn-large" %>
    <% end %>

关系控制器.rb

    def create
      @user = User.find(params[:relationship][:followed_id])
      current_user.follow!(@user)
      redirect_to @user
    end

你能给我解决方案来避免这个错误吗?当我通过 rails 控制台在关系表中插入数据时。没关系。但它不能从表单创建任何新对象并显示此错误。

解决方案 。如果我像以下那样更改第一个参数,那么它可以工作但没有得到取消关注按钮

        <%= form_for(Relationship.new(followed_id: @user.id)) do |f|  %>  
4

3 回答 3

1

您收到此错误是因为 current_user 没有关注 @user 并且它们之间没有关系,因此current_user.relationships.find_by(followed_id: @user.id)返回 nil 作为表单的参数。

正确参考 Michael Hartl 的教程,你会看到

_follow_form.html.erb

<% unless current_user?(@user) %>
  <div id="follow_form">
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>
  </div>
<% end %>

有两个部分显示跟随表单按钮,

1)当用户关注另一个用户/页面时,有_unfollow.html.erb部分

_unfollow.html.erb

<%= form_for(current_user.relationships.find_by(followed_id: @user),
             html: { method: :delete }) do |f| %>
  <%= f.submit "Unfollow", class: "btn btn-large" %>
<% end %>

2)当用户没有关注另一个用户时,有_follow.html.erb部分

_follow.html.erb

<%= form_for(current_user.relationships.build(followed_id: @user.id)) do |f| %>
  <div><%= f.hidden_field :followed_id %></div>
  <%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>
于 2013-08-05T12:47:22.443 回答
0

错误信息是

表单中的第一个参数不能包含 nil 或在 rails 4 中为空。

这意味着在

form_for(current_user.relationships.find_by(followed_id: @user.id))

current_user.relationships.find_by(followed_id: @user.id)返回零。换句话说,当前用户的关系中,没有一个有followed_id == @user.id.

要解决此问题,请尝试弄清楚您为什么要搜索给定的@user.id,以及为什么您期望这种关系存在。

更新

由于您正在尝试创建新关系,因此可以使用

<%= form_for(current_user.relationships.build(followed_id: @user.id)) do |f| %>

反而。find_*尝试在数据库中查找现有记录,而build在内存中创建具有给定属性的记录(尚未保存到数据库。)

于 2013-08-05T13:12:18.860 回答
0

在 Hartl 的教程中它不起作用,但找到了一个解决方案,它很简单,虽然我正在检查 cuurent_user 是否在关注用户?如果不是,那么 partial 会让我关注 page.where 如果使用 <%= form_for(Relationship.new(followed_id: @user.id))%> 创建表单,我可以创建以下用户

于 2013-08-06T06:20:52.733 回答