如何使用条件从视图中渲染视图?

Posted

技术标签:

【中文标题】如何使用条件从视图中渲染视图?【英文标题】:How to render a view from a view using a condition? 【发布时间】:2016-07-25 19:02:21 【问题描述】:

我正在测试 RoR,目前正在尝试找出允许具有有效会话的用户跳过登录的功能。

登录按钮通常会提示您进入登录页面,而我想让有会话的人跳过它并使用条件语句立即重定向到显示视图。 (通过 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

【问题讨论】:

我建议退后一步,研究 MVC 原则(谷歌搜索)。这个重定向应该放在控制器中,而不是视图中。 【参考方案1】:

不确定您的 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 为 nil 时显示。

另外,请查看Rails Tutorial Chapter 8: Basic Login 了解更多信息

【讨论】:

不,我该如何做,以便在渲染视图时,如果 current_user 不为零,它会渲染另一个视图? 您问题中的视图看起来像登录页面,而不是登录部分。这是我的回答所依据的。如果您想渲染部分登录,我建议您使用 Stephan L. 的方法【参考方案2】:

如果您只想向未登录的用户显示登录按钮,则可以在您的视图中使用 render 方法渲染部分:

<% 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" %>

【讨论】:

以上是关于如何使用条件从视图中渲染视图?的主要内容,如果未能解决你的问题,请参考以下文章

React Native:如何隐藏条件渲染以外的元素?

使用 Ember.js,如何在渲染视图后运行一些 JS?

ZF2:如何从其他模块渲染视图

Groovy/grails 如何使用 jquery 从视图中调用控制器方法

如何从视图中呈现特定的 Django 管理页面?

如何等待在 react.js 中渲染视图,直到 $.get() 完成?