日期格式的Rails

时间:2018-10-30 19:08:12

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

我试图仅在生成的行上输出日期,但是当我执行此代码时(我确信它一点也不优雅),它会给我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>

3 个答案:

答案 0 :(得分:2)

正在strftime对象上调用

nil。确保在strftimedatetime对象上调用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/