私はこれをテストしていませんが、うまくいくはずだと思います。
<%= select nil, "name_of_your_model[card_expires_on(1i)]", (Date.today.year..Date.today.year+10).collect { |y| y }, options = {}, id: "card_expires_on_1i" %>
<%= select nil, "name_of_your_model[card_expires_on(2i)]", (Date.today..Date.today.end_of_year).collect { |d| ["#{d.strftime('%m')} - #{d.strftime('%B')}", d.strftime('%m')] }.uniq, options = {}, id: "card_expires_on_2i" %>
<%= text_field_tag "name_of_your_model[card_expires_on(3i)]", nil, type: 'hidden', value: Date.today.day, id: "card_expires_on_3i" %>
基本的に、フォームにdate_selectを入力すると、3つの選択が作成されます。次に、Railsは「(1i)」、「(2i)」、および「(3i)」を使用して、それぞれ年、月、および日を元に戻します。「name_of_your_model」をフォームに使用されるモデルの名前に変更し、text_fieldの値をデフォルトの日に変更してください。
アップデート
私はこれをテストしたところ、うまくいきました!