我有一個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 %>
並且工作!萬一有人懷疑..
我不明白你爲什麼要在標題中呈現註冊表單。無論如何,如果您在用戶登錄後重新渲染標題,則不應呈現此表單。 – Rodrigo