2017-07-01 7 views
1

ログインしてログアウトした後も、フォームの最初の引数をnilまたは空にすることはできません。ユーザーがログインしているときにフォームの消滅を維持しながら、この問題を解決するにはどうすればよいですか?Rails Form_forログアウト後にフォームの最初の引数にnilを含めることはできません。(セッション#破棄)

<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
    <ul class="nav navbar-nav navbar-left"> 
     <li> 
     <% if current_user %> 
     <li> 
      <li><%= link_to "Profile Summary", current_user %></li> 
     </li> 
     <li> 
      <li><%= link_to "Edit personal details", edit_user_path %></li> 
     </li> 
     <li> 
      <li><%= link_to "Logout", logout_path, method: "delete" %></li> 
     </li> 
     <% else %> 
     <li><%= form_for @user do |f| %> 
      <div class="form-group"> 
      <%= f.text_field :email, :placeholder => "Email", class: "form-control" %> 
      </div> 
      <div class="form-group"> 
      <%= f.password_field :password, :placeholder => "Password", class: "form-control" %> 
      </div> 
      <%= f.submit 'Login', class: "btn btn-default" %> 
      <% end %> 
     </li> 
     <% end %> 
     <li> 
      <li><%= link_to "New User", new_user_path %></li> 
     </li> 
     </ul> 
     <ul class="nav navbar-nav navbar-right"> 
     <li> 
      <li><%= link_to 'Opinions', profile_path %></li> 
     </li> 
     <li> 
      <li><%= link_to 'About',contact_path %></li> 
     </li> 
     <li> 
      <li><%= link_to 'Contact', contact_path %></li> 
     </li> 
     </ul> 
    </div> 
    <!-- /.navbar-collapse --> 
    </div> 

次は私のユーザーコントローラ

 def new 
@user = User.new 
    end 
def show 
@user = User.find_by_id(session[:user_id]) 
end 
def create 
@user = User.new(user_params) 
if @user.save 
    flash[:success] = "Account Created. Please Login" 
    redirect_to profile_path 
else 
    flash[:danger] = "Please fill in all your information" 
    render :new 
end 
end 
def edit 
@user = User.find(params[:id]) 
end 
def update 
@user = User.find(params[:id]) 
if @user.update(user_params) 
    redirect_to @user 
    flash[:success] = 'User profile successfully updated.' 
else 
    render :edit 
end 
end 
def profile 
end 

であり、これは、あなたのCURRENT_USERヘルパーメソッドを説明していないとして、それが答えに少し難しいセッションコントローラ

def create 
user = User.find_and_authenticate_user(user_params) 

if user 
    session[:user_id] = user.id 
    flash[:success] = "You are logged in." 
    #redirect_to refers to a get command by default as it is 
    #the only command to display. *_path is a combination of 
    #the RESTful actions 
    redirect_to profile_path 
else 
    flash[:danger] = "Credentials Invalid!!" 
    redirect_to login_path 
end 
end 

def destroy 
session[:user_id] = nil 
flash[:success] = "User logged out!!" 
redirect_to root_path 
end 
+0

form_tagで試してみて、電子メールとパスワードを渡して認証/作成してみませんか? –

+0

'<%= form_for resource、次のように試してください:resource_name do | f | %> ' – Pavan

+0

元のコードを少し編集しました。私はまだform_tagを試していますか? – DGJH

答えて

0

です。

しかし、私の理解によると、current_userメソッドは、ブール値を与えるのではなく、サインインしたユーザーに与えます。

新しいユーザーの場合、showアクションはセッションIDを受信せず、結果として@userはnullになります。さて、あなたの状態は失敗し、それ以外の場合はnullまたは空のエラーが返されます。

これを乗り越えるには、ヘルパーメソッドでsession[:user_id] == @user.idのように比較し、その結果としてブール値を返すか、ヘルパーがログインしている完全なユーザーオブジェクトを返している場合はビュー内のセッションIDと直接比較します。

これは役に立ちます..

関連する問題