我有一个 Rails 应用程序,当用户单击标题上的登录按钮时,会打开一个 Bootstrap 弹出模式,并显示一个表单,要求输入用户电子邮件和密码。当用户键入并按 Enter 时,我使用 window.location.reload();
按钮登录变成一个带有文本的按钮 "Welcome <%= current_user.name %>"
我想要做的是,我可以动态更新它,而不是使用窗口位置重新加载吗?
这是我的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变量,所以它不能正常工作。我该如何解决这个问题?
主 Controller ;
before_action :show_main_header, only: [:home]
def show_main_header
@header_main = true
end
考虑用户登录,从主 Controller 主页操作。但这可能是因为我实际上是从 session#create 操作运行的。我该如何修复它?
编辑
首先,谢谢罗德里戈,
我编写了一个函数来保存最后一个操作;
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 %>
成功了!如果有人想知道..
最佳答案
假设您有一个用于渲染标题的部分 View ( app/views/shared/_header.html.erb
),您需要做的是重新渲染此部分 View 并替换标题 html:
create.js.erb
// window.location.reload();
$('#header-container').html('<%= j render "shared/header"%>')
编辑:
如果@header_main
和@header_listing
变量用于渲染 header 部分,您需要在 sessions#create
中实例化它们行动。
为此,请添加 show_main_header
过滤至SessionsController
也是。
关于javascript - Rails - 动态登录人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37730680/