未定义的方法`[]'为nil:当用户取消关注项目时的NilClass

时间:2013-08-29 13:19:55

标签: ruby-on-rails

在我的应用中,用户可以关注项目。我一直在关注迈克尔·哈特尔的关于跟踪用户的指南,并为后续项目进行调整。

我目前正在开展工作,但当我点击取消关注时,我收到此错误:

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

我不完全确定为什么这条线有效,但我宁愿按照指南,任何想法让它工作?

1 个答案:

答案 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 %>