在我的应用中,用户可以关注项目。我一直在关注迈克尔·哈特尔的关于跟踪用户的指南,并为后续项目进行调整。
我目前正在开展工作,但当我点击取消关注时,我收到此错误:
undefined method `[]' for nil:NilClass
关于我的Follows控制器中的以下部分:
def get_followed_project
@project = Project.find(params[:follow][:followed_id])
end
其余的破坏行动是:
def destroy
current_user.unfollow_project!(@project)
redirect_to @project
end
以下和取消关注的表格部分是:
<%= form_for current_user.follows.build(:followed_id => @project.id) do |f| %>
<%= f.hidden_field :followed_id %>
<%= f.submit "Follow", class: "button" %>
<% end %>
<%= form_for current_user.follows.find_by_followed_id(@project), :html => { :method => :delete } do |f| %>
<%= f.submit "Unfollow", class: "button" %>
<% end %>
这些方法在我的用户模型中:
def follow_project!(project)
follows.create!(:followed_id => project.id)
end
def unfollow_project!(project)
follows.find_by_followed_id(project).destroy
end
我的路线中有这个.rb:
resources :follows, only: [:create, :destroy]
和此:
resources :users do
member do
get :following, :followers
end
end
我发现如果我绕过before_action for destroy而不是把它放在行动的开头:
@project = Follow.find(params[:id]).followed_id
它有效,但后来失败了:
redirect_to @project
我不完全确定为什么这条线有效,但我宁愿按照指南,任何想法让它工作?
答案 0 :(得分:0)
当您点击“取消关注”时,此表单没有名为“followed_id”的字段且您的表单没有任何输入,因此params[:follow][:followed_id]
会抛出错误,将f.hidden_field :followed_id
添加到您的表单:
<%= form_for current_user.follows.find_by_followed_id(@project), :html => { :method => :delete } do |f| %>
<%= f.hidden_field :followed_id %>
<%= f.submit "Unfollow", class: "button" %>
<% end %>