表单中的第一个参数在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中)。