嗨,我一起得到了这段代码:
@coursesFound = @user.available_courses
@courses = []
for course in @coursesFound do
@courseInGroups = course.user_groups
for group in @courseInGroups do
@group = UserGroup.find group.id
if @group.users.map { |u| u.id }.include? @user.id
@courses << course
break
end
end
end
# Wenn ein Kurs keiner Gruppe hinzugefügt wurde
if @courseInGroups.empty?
@courses << course
end
在我的debian vm上工作正常,但在我的直播系统上我收到了这个错误:
undefined method `empty?' for nil:NilClass
我该如何避免这种情况?
答案 0 :(得分:6)
如果此@coursesFound = @user.available_courses
返回空的activerecord关系。
然后这将不会执行
for course in @coursesFound do
@courseInGroups = course.user_groups
for group in @courseInGroups do
@group = UserGroup.find group.id
if @group.users.map { |u| u.id }.include? @user.id
@courses << course
break
end
end
end
这意味着当你到达@courseInGroups
时是
if @courseInGroups.empty?
@courses << course
end
所以你的快速修复将是
if @courseInGroups && @courseInGroups.empty?
@courses << course
end
答案 1 :(得分:2)
您还需要正确初始化对象。
@courseInGroups = course.user_groups || []
如果正确初始化,则不会再出现nil:NilClass
错误。
要摆脱nil:NilClass
错误,您可以使用其他答案。比如try
等。
答案 2 :(得分:2)
使用rails时不要忘记blank?
。 Here您可以很好地了解使用或不使用rails的所有方法。
我没有分析你的代码,只是为了你,我和其他不经常使用这种方法的人,将它们混合然后来到这里 - 只是为了记住:empty?
不是blank?
答案 3 :(得分:1)
您可以使用@courseInGroups
方法来避免此错误
@ courseInGroups.try(?:空)
如果@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mDrawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
TextView lbl = (TextView) mDrawerListView.findViewById(R.id.section_label);
Typeface tf = Typeface.createFromAsset(getActivity().getAssets(),"fonts/Jaapokki-Regular.otf");
lbl.setTypeface(tf);
mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
});
mDrawerListView.setAdapter(new ArrayAdapter<String>(
getActionBar().getThemedContext(),
R.layout.fragment_main,
R.id.section_label,
new String[]{
getString(R.string.title_section1),
getString(R.string.title_section2),
getString(R.string.title_section3),
"Acerca de...",
}));
mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return mDrawerListView;
}
为零