未定义的方法`空?'对于nil:NilClass如何避免它

时间:2015-08-04 09:30:05

标签: ruby-on-rails ruby ruby-on-rails-4

嗨,我一起得到了这段代码:

 @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

我该如何避免这种情况?

4 个答案:

答案 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; } 为零

,则不会抛出错误

http://apidock.com/rails/Object/try