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

Ruby on rails 在rails 4中,表单中的第一个参数不能包含nil或为空,ruby-on-rails,ruby,Ruby On Rails,Ruby,我是rails新手,在Michael Hartl的rails 4教程的帮助下做了一个项目 为以下用户创建表单时,它会显示 在rails 4中,表单中的第一个参数不能包含nil或为空 <%= form_for(current_user.relationships.find_by(followed_id: @user.id)) do |f| %> <div> <%= f.hidden_field :followed_id %> &l

我是rails新手,在Michael Hartl的rails 4教程的帮助下做了一个项目 为以下用户创建表单时,它会显示 在rails 4中,表单中的第一个参数不能包含nil或为空

    <%= 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 %>
你能给我一个解决方案来避免这个错误吗?当我通过rails控制台在relationships表中插入数据时。没关系。但它不能从窗体创建任何新对象并显示此错误

解决方案。如果我像follow那样更改第一个参数,那么它会工作,但不会得到unfollow按钮

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

之所以出现此错误,是因为当前\u用户没有跟随@user,并且它们之间没有关系,因此当前\u user.relationships.find\u by(跟随\u id:@user.id)将nil作为参数返回表单

正确参考Michael Hartl的教程,您将看到

\u follow\u form.html.erb

<% unless current_user?(@user) %>
  <div id="follow_form">
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>
  </div>
<% end %>
<%= form_for(current_user.relationships.find_by(followed_id: @user),
             html: { method: :delete }) do |f| %>
  <%= f.submit "Unfollow", class: "btn btn-large" %>
<% end %>
<%= 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 %>
2) 当用户没有跟踪另一个用户时,会出现
\u follow.html.erb
部分错误

\u follow.html.erb

<% unless current_user?(@user) %>
  <div id="follow_form">
  <% if current_user.following?(@user) %>
    <%= render 'unfollow' %>
  <% else %>
    <%= render 'follow' %>
  <% end %>
  </div>
<% end %>
<%= form_for(current_user.relationships.find_by(followed_id: @user),
             html: { method: :delete }) do |f| %>
  <%= f.submit "Unfollow", class: "btn btn-large" %>
<% end %>
<%= 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 %>

错误消息为

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

这意味着

form_for(current_user.relationships.find_by(followed_id: @user.id))
current\u user.relationships.find\u by(后跟@user.id)
返回nil。换言之,在当前用户的关系中,没有一个的
跟在\u id==@user.id
后面

要解决此问题,请尝试找出为什么要搜索给定的
@user.id
,以及为什么希望存在此关系

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

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


相反
find.*
尝试在数据库中查找现有记录,而
build
使用给定属性在内存中创建记录(即尚未保存到数据库)。

在Hartl的教程中,它不起作用,但找到了一个简单的解决方案,而我正在检查cuurent_用户是否在跟踪用户?如果没有,那么partial会让我跟随页面。如果使用
我可以创建以下用户

我无法理解,你想做什么?感谢大家的支持现在一切都很好:)我正确地遵循了他的教程,但无法摆脱这个错误。谢谢你的评论啊!我想你应该明白这一点,当你试图找到一个不存在的关系时,你会得到零。这就是为什么您将与当前用户进行检查。以下(@user)?,只有当它为true时,您才会调用相应的关系,如果它为false,您将显示用于形成关系的另一个表单。如果你正确地遵循教程,你将不会得到错误。请再检查一次。我不希望在我想与follow建立关系的地方存在这种关系。@user.id是当前_用户之外的其他id,当前_用户将跟随其他用户。@user.id为零,但原因是什么。此表单将显示在用户的显示页面中。在“用户控制器显示行动”中,这是对您的宝贵评论的感谢。我发现没有关系,因为它显示了这个错误。在这种情况下,我应该如何通过follow按钮建立关系?