我目前正在尝试使用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
不确定如何解决此错误,非常感谢任何帮助。
答案 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
仅此而已。
我希望这会有所帮助