Deviseで確認画面 ~ちょっとマシだと信じたい方法 2012冬~

/confirm 足したくなかった(Controller弄りたくなかった)っていうのと、<%= render "devise/shared/links" %> をそのまま使いたかった、できる限りViewに条件とか書きたくないっていうのがあった。 汚いとは思うけど、個人的に許容できるギリギリの感じで、まあこんなもんかって感じ。

app/models/user.rb

class User < ActiveRecord::Base
  attr_accessor :confirmed, :under_confirming
  attr_accessible :confirmed, :under_confirming
  validates :confirmed, :presence => { :message =>'is not confirmed' }
  after_validation :set_under_confirming

  def set_under_confirming
    if errors.keys.reject { |e_name| e_name == :confirmed }.empty?
      self.under_confirming = true
    else
      self.under_confirming = false
    end
  end
end

app/views/users/registrations/new.html.erb

<h2>Sign up</h2>

<%= form_for resource, :as => resource_name, :url => registration_path(resource_name) do |f| %>
  <%= f.label :email %>
  <% if resource.under_confirming %>
    <!-- For confirming -->
    <%= resource.email %>
    <%= f.hidden_field :email  %>
    <%= f.hidden_field :confirmed, :value => 1  %>
    <%= f.submit "登録" %>
  <% else %>
    <%= devise_error_messages! %>
    <!-- For new form -->
    <%= f.email_field :email %>
    <%= f.submit "確認画面に行くぞ〜" %>
  <% end %>

  <%= render "devise/shared/links" %>
<% end %>