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

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

 

relationships_controller.rb

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

你能帮我解决一下这个错误吗? 而我通过rails控制台在关系表中插入数据。 没关系。 但它无法从表单创建任何新对象并显示此错误。

解决方案 如果我改变了第一个参数,就像下面那样它的工作,但没有得到取消关注按钮

   

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

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

_follow_form.html.erb

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

有两个部分显示以下表单按钮,

1)当用户跟随​​另一个用户/页面时,有_unfollow.html.erb partial

_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 partial

_follow.html.erb

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

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

错误消息是

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

这意味着

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

current_user.relationships.find_by(followed_id: @user.id)返回nil。 换句话说,在当前用户的关系中,他们都没有followed_id == @user.id

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

更新

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

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

代替。 find_*尝试在DB中查找现有记录,而build使用给定属性在内存中build记录( 尚未保存到DB中)。