0

私はこれを数時間試みてきました。私はRubyとRailsにかなり慣れていません。

devise.html.erbファイルに私は持っています

<div class="container">
<%= render :partial => 'layouts/header' if user_signed_in? %>
</div>

上記は問題なく動作します。ユーザーがサインインしている場合は、私のページの上部にヘッダーが表示されます。サインインしていない場合は、ヘッダーは表示されません。

しかし、私は持っている必要があります(ユーザーは次のページにアドレスを入力する必要があるため):

 <div class="container">
<%= render :partial => 'layouts/header' if current_user.registration_complete?  %>

また、アプリを再起動すると、次のエラーメッセージが表示されます。

NoMethodError in Devise/registrations#new

私のプロジェクトの他の場所、user.rb(私のプロジェクトの他の部分は問題なく認識できます)でregistration_completeを次のように定義しています:

#Determines whether user completed his profile on registration or not
 def registration_complete?
self.address.present?
 end

このコードを他の場所に配置して、devise.html.erbで認識されるようにする必要がありますか?

4

4 に答える 4

2

NoMethodError in Devise/registrations#newなぜなら-

このことを考慮:

<div class="container">
<%= render :partial => 'layouts/header' if current_user.registration_complete?  %>

上記current_userのコードのはnil、登録ページでユーザーがログインしていないためです。

したがってregistration_complete、nilの方法はありません。

current_user次の方法で、コード内のどこにでも存在を確認することもできます。

if current_user
 #User is logged in
    <div class="container">
    <%= render :partial => 'layouts/header' if current_user.registration_complete?  %>
else
 #User is not logged in
 #Don't try current_user.registration_complete? check here..it will give error.
end

したがって、current_user.registration_complete?ログインしていれば、チェックを含むコードをアプリケーションのどこにでも配置できます。

于 2013-03-06T15:06:08.383 に答える
0

どうですか:

<%= render :partial => 'layouts/header' if current_user && current_user.registration_complete?  %>
于 2013-03-06T15:06:49.693 に答える
0

Saurabh Jain が既に指摘したように、current_user が nil になる場合があるため、何らかの方法でそれを処理する必要があります。

彼の if ステートメント forcurrent_userは、それを処理する良い方法です。

これを構造化するもう 1 つの方法は、ユーザーがヘッダーをヘルパー メソッドに表示するかどうかを決定するすべてのロジックを、プレゼンターに配置することです (たとえば、draperを参照)。

コントローラーでは、ここに常にユーザー オブジェクトが存在することも確認します。ログインしているユーザーがいない場合は、新しい User オブジェクトをダミーとして作成します。そうすれば、厄介な nil-problems が少なくなります。

例えば:

# In your controller
@user = current_user || User.new

# In a helper
def can_see_header? (user)
  user_signed_in? and user.registration_complete?
end

# In view
<div class="container">
  <% if can_see_header? @user %>
    <%= render "layouts/header" %>
  <% end %>
</div>

render 呼び出しの:partialキーは、少なくとも Rails 以外の新しいバージョンでは、追加のオプションを渡したい場合にのみ必要です。

于 2013-03-06T15:16:25.977 に答える
0

助けてくれてありがとう。Stackoverflow のようなサイトがなければ、私は迷ってしまうでしょう!

最後に、Adbeel と Jesper のソリューションを組み合わせて使用​​しました。

私が使用した:

<div class="container">
<%= render :partial => 'layouts/header' if user_signed_in? && current_user.registration_complete?%>
</div>

私が言ったように、それはうまく機能しますが、私が知らない災害がこの先に潜んでいると思われる場合は、お知らせいただければ幸いです!ありがとうございました。

クリストフ。

于 2013-03-07T11:25:19.033 に答える