nil的未定义方法`id':NilClass

时间:2014-04-07 11:43:24

标签: ruby-on-rails

我目前正在尝试使用RoR打造一个网球网站。该网站有一个后端,目前在数据库,用户和事件中有两个表。我试图在两个表之间建立一个has_many关系,然后创建一个表单,让用户注册这些不同的事件。我非常接近,但在我看来,我一直遇到这个错误:

    undefined method `id' for nil:NilClass

   <%= link_to event.title, event %>
  | <%= link_to "delete", event, method: :delete %>

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

这是我的关系控制器

    class RelationshipsController < ApplicationController

      def create
       @relationship = Relationship.new(relationship_params)
       @user = User.find(params[:relationships][:event_id])
       current_user.follow!(@user)
       respond_to do |format|
       format.html { redirect_to @user }
       end
     end
    end

我的事件控制器的相关部分:

   def new
     @event = Event.new
   end

   private

   def event_params
     params.require(:event).permit(:title, :Venue, :Time, :Date)
   end

不确定如何解决此错误,非常感谢任何帮助。

3 个答案:

答案 0 :(得分:4)

您应该初始化@user变量

def new
  @user = User.new
  @event = Event.new
end

答案 1 :(得分:1)

在您的控制器新操作中,您必须定义@user。目前这个变量是空的。因此,如果您对某些不存在的内容调用id方法,则会收到错误undefined method id for Nil...

例如:

def new
  @user = User.find(1)
  @event = Event.new
end

答案 2 :(得分:0)

在处理 Rails 应用程序时遇到类似的问题。问题是我在控制器中调用了不必要的实例变量。

在这里

我在$decoded = JWT::decode($id_token, $key, array('RSA256')); 中调用了不必要的@admin实例变量

sessions / admins_controller.rb

log_in @admin

但是错误消息被我的def create user = User::Admin.find_by(email: params[:sessions_admin][:email].downcase) if user && user.authenticate(params[:sessions_admin][:password]) log_in @admin format.html { redirect_to users_admin_url(user), notice: 'Admin was successfully logged in.' } format.json { render :show, status: :created, location: users_admin_url(user) } else format.html { render :new } format.json { render json: @admin.errors, status: :unprocessable_entity } end end 文件中包含的相应帮助文件中的rails标记。:

sessions / admins_helper.rb

application_controller

我只需要在module Sessions::AdminsHelper # Logs in the given user. def log_in(user) session[:user_id] = user.id end end 中的创建操作中修改以下方法的方法调用

sessions/admins_controller.rb

log_in @admin

仅此而已。

我希望这会有所帮助