我试图仅在生成的行上输出日期,但是当我执行此代码时(我确信它一点也不优雅),它会给我undefined method 'strftime' for nil:NilClass
<% @person.subordinates.each do |sub| %>
<tr>
<td>
<% if sub.position == 'alumni' %>
<p>
<%= link_to(sekret_person_path(sub.position, sub.user_name)) do %>
<strong><%= sub.fname %> <%= sub.lname %>,</strong>
<% end %> <%= sub.startdate.strftime("%Y") %> - <%= sub.graddate.strftime("%Y") %>
</p>
<% end %>
</td>
</tr>
<% end %>
在我的代码中,我正在使用@person.startdate.strftime("%m/%d/%Y")
,没有任何问题,但是我认为我的问题是我正在使用sub调用,该调用正在捕获标记为该人为sub的任何人。 / p>
答案 0 :(得分:2)
strftime
对象上调用 nil
。确保在strftime
,date
或time
对象上调用datetime
。
请参考strftime
在Rails Apidock-https://apidock.com/ruby/DateTime/strftime
答案 1 :(得分:2)
您的错误表明您的属性之一为nil。该语法正确。尝试使用以下命令进行调试:
class HomePage extends StatefulWidget {
// const HomePage({Key key}) : super(key: key);
@override
HomePageState createState() {
return new HomePageState();
}
}
class HomePageState extends State<HomePage> {
List<String> temp=new List();
List<String> temp1=['Nile University', 'Smart Village', 'Zewail'];
Map<String,String> map1={};
@override
void initState() {
super.initState();
getplaces(temp);
getuser(map1,'1jKpg81YCO5PoFOa2wWR');
}
Future<List> getuser(temp,String place) async{
List<String> userids=[];
QuerySnapshot usersubs= await Firestore.instance.collection('tempSubs').getDocuments();
QuerySnapshot userid= await Firestore.instance.collection('users').where('place',isEqualTo: place).getDocuments();
userid.documents.forEach((DocumentSnapshot doc,){
usersubs.documents.forEach((DocumentSnapshot doc1){
if(doc.documentID==doc1.documentID){
doc1.data['products'].forEach((k,v){
if( DateTime.fromMillisecondsSinceEpoch(v).day==DateTime.now().day){
int x= DateTime.fromMillisecondsSinceEpoch(v).day;
print('keey equal $k and v is $x');
print('dy is $x');
userids.add(
doc.documentID);
}
});
}
} ); }
);
print('doc.documentID');
print (userids);
setState(() {});
return userids;
}
Future<List> getplaces(temp) async{
QuerySnapshot place= await Firestore.instance.collection('places').getDocuments();
place.documents.forEach((DocumentSnapshot doc){
temp.add(
doc.data['name']
);
// print(doc.data['name']);
});
// print(temp);
setState(() {});
return temp;
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Home Page"),
),
body: !temp.isNotEmpty?
CircularProgressIndicator():
Row(mainAxisSize:MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceAround,
children:<Widget>[
Container(
height: 100.0,
child:
ListView.builder(
scrollDirection: Axis.horizontal,
itemExtent: 100.0,
itemCount:temp.length,
itemBuilder:(BuildContext context, int index) {
return ListTile(title: Text(temp[index]),onTap:
(){
print(temp[index]);
}
);}
),),
Container(child:Text('data'),)
],),
);
}
}
此行上检索到的元素将是给您错误的元素,因为您正尝试运行@person.subordinates.select { |sub| sub.startdate.nil? || sub.graddate.nil? }
,这很有意义。
您应该在nil.strftime('%Y')
上使用条件来停止它,例如:
.erb
这不是Rails的错误。
答案 2 :(得分:1)
另一种可以解决nil
的问题的解决方法是:
<%= sub.startdate&.strftime("%Y") %> - <%= sub.graddate&.strftime("%Y") %>
这样,您不必添加条件即可确保调用它们之前链中的任何方法/属性都存在。之所以如此,是因为有了安全的导航操作符,此处对此进行了深入说明:https://rubyinrails.com/2017/11/17/safe-navigation-operator-ampersand-dot-in-ruby/