1

devise_error_messages! ビューの原因で

undefined method 'errors' for nil:NilClass

render :newメソッドの後create。これは、「ApplicationController」ではなく「Devise::RegistrationsController」から RegistrationsController を継承した後に発生し始めました。「新しい」メソッドの最初のレンダリングでは、例外は発生しません。

オーバーライドされた登録コントローラー:

class RegistrationsController < Devise::RegistrationsController
  def create
    begin
      raise I18n.t("registration_disabled") unless registration_enabled?
      ....................
    rescue => ex
      flash[:alert] = ex.message
      render :new
    end
  end
end

ビュー registrations/new.html.erb:

<h2><%= I18n.t("sign_up_title") %></h2>

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
    <%= devise_error_messages! %>

    <div><%= f.label :login, I18n.t("the_login") %> <span class="mandatory">*</span><br />
      <%= f.text_field :login %></div>

    <div><%= f.label :password, I18n.t("password") %> <span class="mandatory">*</span><br />
      <%= f.password_field :password %></div>

    <div><%= f.label :password_confirmation, I18n.t("password_confirmation") %> <span class="mandatory">*</span><br />
      <%= f.password_field :password_confirmation %></div>

    <div><%= f.submit from_admin? ? I18n.t("sign_up_other") : I18n.t("sign_up") %></div>
    <p class="mandatory">* - <%= I18n.t("mandatory_fields") %></p>
<% end %>

<%= render "devise/links" %>
4

1 に答える 1

2

オブジェクト(デバイスはそれをリソースと呼びます)が作成される前に例外を発生させているためだと思います。そして、それはdevise_error_messagesヘルパーによって必要とされます。

登録へのアクセスを防止したい場合は、これを実現する他の方法があります。

1つの方法は次のとおりです。

class RegistrationsController < Devise::RegistrationsController
  def create
    if registration_enabled?
      super
    else
      flash[:alert] = I18n.t("registration_disabled")
      redirect_to action: :new
    end
  end
end

これが機能するかどうかは 100% わかりませんが、このアイデアは、ユーザーが登録できない場合にビューをフラッシュでレンダリングすることであるため、これは「初期レンダリング」として動作します。

編集:実際、私はあなたの変更を信じています

render action: :new

redirect_to action: :new

redirect_to がメソッドを実行するのに対し、render は関連付けられたビューをレンダリングするだけなので、エラーを防ぐには十分です。

于 2012-09-30T23:37:50.670 に答える