从Rails控制器调用Javascript函数

从Rails控制器调用Javascript函数,javascript,jquery,ruby-on-rails,ruby-on-rails-4,Javascript,Jquery,Ruby On Rails,Ruby On Rails 4,我有一个应用程序,您可以从application.html.erb中的标题登录和注销。signin表单(或signout链接)分别调用用户#signin或用户#signout操作。两个操作都会调用重定向到根路径。那部分有效 我想要的是动态更新标题,而不是刷新页面(即删除重定向到)。我想通过javascript/jquery(但不是咖啡)实现这一点。文件views/users/signIn.js包含三个函数:一个用于用户登录,一个用于管理员登录,另一个用于用户/管理员注销 我在互联网上搜遍了,但我

我有一个应用程序,您可以从application.html.erb中的标题登录和注销。signin表单(或signout链接)分别调用用户#signin或用户#signout操作。两个操作都会调用重定向到根路径。那部分有效

我想要的是动态更新标题,而不是刷新页面(即删除重定向到)。我想通过javascript/jquery(但不是咖啡)实现这一点。文件views/users/signIn.js包含三个函数:一个用于用户登录,一个用于管理员登录,另一个用于用户/管理员注销

我在互联网上搜遍了,但我找不到答案。简而言之,在我登录(或注销)一个用户或管理员之后,我想从signin.js(或signin.js.erb,我对此感到困惑)中包含的users_controller.rb调用一个javascript/jquery函数

我的代码如下。多谢各位

用户\u controller.rb

class UsersController < ApplicationController
include UsersHelper
include AdminsHelper
before_action :correctUser, only: [:edit, :update, :destroy]


...


def signIn
    user = User.find_by(email: params[:user][:email].downcase)
    if user && user.authenticate(params[:user][:password])
        signInUser user
        render js: "sUser();" #Call to javascript function
    else 
        admin = Admin.find_by(email: params[:user][:email].downcase)
        if admin && admin.authenticate(params[:user][:password])
            signInAdmin admin
            render js: "sAdmin();" #call to js function
        else
            flash[:error] = "Invalid email or password"
            redirect_to root_path
        end
    end
end

def signout
    #works for both users and admins
    signOutUser
    render js: "signoutAll();" # call to js function
end

private

    def correctUser
        redirect_to root_path unless User.find(params[:id]) == currentUser || adminSignedIn?
    end

    def userParams
        params.require(:user).permit(:name, :email,
            :password, :password_confirmation)
    end

    def signInUser(user)
        rememberToken = User.newRememberToken
        cookies[:remember_token] = rememberToken
        #change to cookies.permanent to make cookie stay after browser close
        user.update_attribute(:remember_token, User.digest(rememberToken))
    end

    def signInAdmin(admin)
        rememberToken = Admin.newRememberToken
        cookies[:remember_token] = rememberToken
        #change to cookies.permanent to make cookie stay after browser close
        admin.update_attribute(:remember_token, Admin.digest(rememberToken))
    end

    def signOutUser
        #Works for both users and admins
        cookies.delete(:remember_token)
    end
end
class UsersController
视图/用户/signIn.js

function sAdmin() {
    $("#signin").html("Signed in as Admin \
    <%= escape_javascript(link_to currentAdmin.name, currentAdmin)%>. \
    <%= escape_javascript(link_to "Sign Out", signout_path)%>");
}

function sUser(){
    $("#signin").html("Signed in as User \
    <%= escape_javascript(link_to currentUser.name, currentUser)%>. \
    <%= escape_javascript(link_to "Sign Out", signout_path)%>");
}

function signoutAll(){
    $("#signin").html("blah <%= render 'static_pages/form' %>");
}
函数sAdmin(){
$(“#sign”).html(“以管理员身份登录\
. \
");
}
函数sUser(){
$(“#登录”).html(“以用户身份登录\
. \
");
}
函数signoutAll(){
$(“#sign”).html(“废话”);
}

如果您的方式不对,您应该让javascript在控制器中调用一个操作,让用户注销或登录。然后在js中执行必要的操作。@Iceman好的,我已经从javascript启动了登录/退出功能。但是,当添加一些rails代码(即“”)时,它只显示为纯文本。这是因为javascript位于.js文件而不是.js.erb文件中吗?如果是这样,我将把这个.js.erb文件放在哪里?谢谢。好的,我解决了这个问题。我仍然无法直接调用函数,所以仍然有点令人沮丧。