javascript - Rails - 动态登录人员

标签 javascript jquery ruby-on-rails twitter-bootstrap

我有一个 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/

相关文章:

javascript - 如何更改 Google Pagedown 编辑器以使用超棒的字体图标?

javascript - 在 HR 上设置类别会破坏 TD colspan

javascript - Chrome稳定排序功能

javascript - .net core Razor 页面与 JQuery AJAX

ruby-on-rails - 向 content_tag 添加空白属性

sql - 查找关联计数大于零的所有记录

javascript - 在每个 Ajax 调用上重新加载被调用的页面

javascript - 我的必填字段消息未显示在正确的位置

javascript - 在 html 幻灯片中装箱

ruby-on-rails - ActiveRecord::Relation 对象如何调用类方法