Rails,创建一个没有视图的方法是一个好习惯吗?

Tas*_*dis 2 ruby ruby-on-rails

我有一个模型AdminUser,admin_users我的视图中的文件夹只有2个视图(仪表板索引),以及一个AdminUsersController:

class AdminUsersController < ApplicationController
  def dashboard
  end

  def index
  end

  def login
    if params[:admin_user][:username].present? && params[:admin_user][:password].present?
      found_user = AdminUser.where(:username => params[:admin_user][:username]).first
      if found_user
        authorized_user = found_user.authenticate(params[:admin_user][:password])
        session[:admin]=params[:admin_user][:username]
      end
    end
    if authorized_user
       redirect_to :controller => 'admin_users', :action => 'dashboard'
    else
      render :nothing => true, :status => :ok
    end 
  end
end
Run Code Online (Sandbox Code Playgroud)

虽然我有一个登录操作,但我没有它的观点,因为我真的不需要它.

但是Rails搜索视图这一事实让我觉得我做错了; 或者至少不以Rails-y方式做某事.

我应该用另一种方式吗?

Mic*_*ill 7

您不需要有视图.事实上,存在一些不需要视图的好理由:

  • 在返回之前重定向的操作,例如标准Rails创建和更新操作
  • 呈现内联的动作,例如CSV生成器
  • 呈现ajax结果的动作
  • 作为REST API端点的操作

这些惯例适用于最常见的情况,但也有一些较为常见且仍然有效的情况的惯例.

请注意,不应将可渲染操作的方法放在类的protectedprivate部分中,以使它们与实际操作分开.不要在控制器的公共接口中公开任何方法,除了那些旨在作为操作的方法.

如果你碰巧有一个动作(就像问题中的例子一样),你可以说服Rails通过提前返回来绕过搜索对应于该动作的视图.虽然看起来redirect_to已经足够,但它实际上只是响应的一部分.这样做的常用方法是使用redirect_to :page and return成语.

对于给出的示例,使用此:

if authorized_user
  redirect_to :controller => 'admin_users', :action => 'dashboard' and return
else
  render :nothing => true, :status => :ok
end 
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅以下优秀问题和答案:


bku*_*i01 5

没有观点是完全可以的。当将不需要视图的方法添加到控制器时,例如创建/更新/销毁方法,您会注意到需要在该方法内添加指向另一个视图的“ render”或“ redirect_to”语句。这告诉Rails不要遵循规范,而是寻找具有该动作名称的视图。