2016-06-09 89 views
0

我有一個Rails應用程序,當用戶單擊登錄按鈕上的標題引導彈出窗口模式打開窗體,要求用戶的電子郵件和密碼。當用戶鍵入和按下輸入,我使用window.location.reload();和按鈕登錄變成一個按鈕與文字說"Welcome <%= current_user.name %>"Rails - 動態登錄人

我想要做的是,而不是使用窗口位置重新加載,我可以更新這動態?

這裏是我的sessions#create行動

def create 
    user = User.find_by(email: params[:session][:email].downcase) 
    respond_to do |format| 
    if user && user.authenticate(params[:session][:password]) 
    if user.activated? 
     log_in user 
     params[:session][:remember_me] == '1' ? remember(user) : forget(user) 

     format.html { redirect_back_or user } 
     flash[:notice] = t('flash.sessions.create.success.html') 
     format.js #here I should do smth 
    else 
     format.html { redirect_to root_url } 
     format.json { render json: {email:['Account not activated. Check your email for the activation link.']} , status: :unprocessable_entity} 
     format.js { render json: {email:['Account not activated. Check your email for the activation link.']}, status: :unprocessable_entity } 
end 

那麼create.js.erb

// close modal 

    $('#login-dialog').fadeToggle(); 
    // clear form input elements 
    // todo/note: handle textarea, select, etc 
    $('form input[type="text"]').val(''); 

    //Clear previous errors 
    $('.form-group.has-error').each(function(){ 
    $('.help-block').html(''); 
    $('.form-group').removeClass('has-error'); 
    }); 

    window.location.reload(); #here I am reloading the page then I can see login button disappears and new button saying Welcome Billy appears. 

所以,我該怎麼辦,如果沒有重新加載窗口。 謝謝

編輯

的事情是,我也立即登記模式,讓用戶可以點擊打開這些模式的代碼在header.html.erb,當我渲染頁面,你建議給註冊表單提供了一個錯誤;

<% modal ||= false %> 
<% remote = modal ? true : false %> 
<%= form_for(@user, remote: modal, :html => {role: :form, 'data-model' => 'user'}) do |f| %> 


<div class="form-group"> 
    <%= f.label :name, t('header.nameSurname') %>  
    <span class="help"></span> 
    <%= f.text_field :name, class: 'form-control' %> 
    <span class="help-block"></span> 
</div> 

<div class="form-group"> 
    <%= f.label :username, t('header.username') %> 
    <span class="help"></span> 
    <%= f.text_field :username, class: 'form-control' %> 
    <span class="help-block"></span> 
</div> 
.... 

因爲@user可變的,如果我將其更改爲User.new是否確定?,它會創建問題?

我也有3個不同的標題部分。我通常在application.html.erb中將它們渲染爲;

<div id="render_main"> 
    <% if @header_main %> 
    <%= render 'layouts/header_main' %> <!--Header comes here--> 
    <% elsif @header_listing %> 

    <%= render 'layouts/header_listing' %> <!--Header comes here--> 
    <% else %> 
    <%= render 'layouts/header' %> 
    <% end %> 
    </div> 

但是在create.js.erb;

// close modal 

    $('#login-dialog').fadeToggle(); 
    // clear form input elements 
    // todo/note: handle textarea, select, etc 
    $('form input[type="text"]').val(''); 

    //Clear previous errors 
    $('.form-group.has-error').each(function(){ 
    $('.help-block').html(''); 
    $('.form-group').removeClass('has-error'); 
    }); 

    //window.location.reload(); 


    <% if @header_main %> 
    $('#render_main').html('<%= j render "layouts/header_main"%>') 
    <% elsif @header_listing %> 

    $('#render_main').html('<%= j render "layouts/header_listing"%>') 
    <% else %> 
    $('#render_main').html('<%= j render "layouts/header"%>') 
    <% end %> 

因爲我渲染它找不到@header_main變量我相信,所以它不工作,因爲它應該是。我怎樣才能解決這個問題?。

主控制器;

before_action :show_main_header, only: [:home] 
def show_main_header 
    @header_main = true 
    end 

考慮用戶登錄,從主控制器主動作。但這可能是因爲我實際上從會話#創建動作運行。我該如何解決它?

編輯

首先,謝謝羅德里戈,

我寫了一個函數來保存最後一個動作;

def location_action_name 
    if !logged_in? 
     url = Rails.application.routes.recognize_path(request.referrer) 
     @last_action = url[:action] 
    end 
    end 

然後我寫入create.js.erb;

<% if (@last_action == "home") %> 
    $('#render_main').html('<%= j render "layouts/header_main"%>') 
    <% elsif (@last_action == "listings") %> 

    $('#render_main').html('<%= j render "layouts/header_listing"%>') 
    <% else %> 
    $('#render_main').html('<%= j render "layouts/header"%>') 
    <% end %> 

並且工作!萬一有人懷疑..

+0

我不明白你爲什麼要在標題中呈現註冊表單。無論如何,如果您在用戶登錄後重新渲染標題,則不應呈現此表單。 – Rodrigo

回答

1

假設你有渲染的標題(app/views/shared/_header.html.erb)的局部視圖,你需要做的是重新呈現這部分並更換頭HTML:

create.js。ERB

// window.location.reload(); 
$('#header-container').html('<%= j render "shared/header"%>') 

編輯:

如果使用@header_main@header_listing變量來使頭部分,你需要實例化它們在你的sessions#create行動。

爲此,請將show_main_header篩選器添加到SessionsController

+0

剛剛編輯謝謝你 –