2016-07-25 74 views
0

我正在测试RoR,并且正在尝试弄清楚允许用户使用有效会话跳过登录的功能。如何使用条件渲染视图中的视图?

登录按钮通常会提示您登录页面,但我想使它以便会话的人跳过它并立即使用条件语句重定向到show view。 (通过CURRENT_USER检查) (如果您需要任何其他代码只是评论)

这里的登录视图

<%= form_for :session, url: '/login' do |s| %> 
<%= s.text_field :username, :placeholder => 'Username' %> 
<%= s.password_field :password, :placeholder => 'Password' %> 
<%= s.submit "Login" %> 

<% if current_user %> 
    <!-- What do i write here? --> 
    <!-- Maybe I should put this in a controller? --> 
    <% end %> 

<% if flash[:notice] && current_user %> 
    <div class="notice"><%= flash[:notice] %></div> 
<% end %> 

下面是一个包含了CURRENT_USER功能的应用程序控制器。 (万一)

class ApplicationController < ActionController::Base 
protect_from_forgery with: :exception 

helper_method :current_user 

def current_user 
    @current_user ||= User.find_by(id: session[:id]) if session[:id] 
end 
end 
+2

我建议退一步和研究MVC原则(谷歌它)。这个重定向应该放在控制器中,而不是放在视图中。 –

回答

2

不知道你SessionsController看起来像什么,而是你可以添加这样的事情:

class SessionsController < ActionController::Base 
    before_action :check_current_user 

    def check_current_user 
    redirect_to :root, success: "You are already logged in." if current_user 
    end 
end 

然后你就可以在你的登录视图中删除if current_user声明。并为您的登录链接,你可以写:

<%= link_to 'Login', new_session_path unless current_user %> 

这样的登录按钮只显示如果current_user是零。

此外,看一看Rails Tutorial Chapter 8: Basic Login了解更多信息

+0

不,我该如何做到这一点,以便当一个视图呈现时,如果current_user不是零,它呈现另一个视图? –

+0

您的问题中的视图看起来像一个登录页面,而不是登录部分。这是我的答案是基于。如果你想渲染一个登录部分,我建议你采用Stephan L.的方法 –

1

在你的看法,你可以渲染渲染方法谐音,如果你只是想显示的登录按钮,用户是没有登录:

<% unless current_user %> 
    <%= render 'login_form' %> 
<% end %> 

然后,你需要有一个名为“_login_form”文件在您的视图目录:

<%= form_for :session, url: '/login' do |s| %> 
<%= s.text_field :username, :placeholder => 'Username' %> 
<%= s.password_field :password, :placeholder => 'Password' %> 
<%= s.submit "Login" %>