Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 要重定向还是要显示部分?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 要重定向还是要显示部分?

Ruby on rails 要重定向还是要显示部分?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个用户可以有0到多个业务 我想展示: 如果用户尚未创建任何业务或服务,则显示新业务页面 如果他们有1个业务或 如果有多个业务,则显示业务索引页 我应该把这个逻辑放在哪里?在视图中还是在控制器中 例如,在控制器中: if !@user.businesses.any? redirect_to new_user_business_path(@user) elsif @user.businesses.count == 1 redirect_to business_path(@user.busi

我有一个用户可以有0到多个业务

我想展示:

  • 如果用户尚未创建任何业务或服务,则显示新业务页面
  • 如果他们有1个业务或
  • 如果有多个业务,则显示业务索引页
我应该把这个逻辑放在哪里?在视图中还是在控制器中

例如,在控制器中:

if !@user.businesses.any?
redirect_to new_user_business_path(@user)
elsif @user.businesses.count == 1
redirect_to business_path(@user.businesses.first)
elsif @user.businesses.count > 1
redirect_to businesses_path(@user)
end
或者在视图中:

<% if !@user.businesses.any? %>
<%= render partial 'no_businesses' %>


在视图中,这似乎不正确,但我认为最好是寻求最佳实践。

如果逻辑不能与主流分离,那么可以将其作为主流的一个功能进行查看。如果逻辑是另一个逻辑的一部分,则控制逻辑的代码应放入控制器,或者如果代码太大,则放入控制器的助手

因此,如果只是主视图的一部分,即没有
else
语句,或者如果它有
else
语句,但没有重大更改或呈现,则可以将逻辑作为其一部分放入视图中:

<% if !@user.businesses.any? %>
<%= render partial 'no_businesses' %>
<% end %>

如果您有
else
语句,并且它对主操作视图有重大更改,请将逻辑放入contoller,并为每种情况生成两个视图


但是对于您的情况,我会将逻辑或控制器的助手放在控制器内使用。

如果您的用户要查看@相同的url,而只是根据某些逻辑(例如,他们拥有的业务数量)查看不同的视图,则您需要基于视图的逻辑

如果上述情况适用于所有人(我诚实地认为不应该如此),那么就把逻辑放在视图中

如果您想要分离的URL,那么将其放入控制器中,正如您在上面所指定的那样

for user with no business: http://www.application.com/businesses/new
for user with 1 business: http://www.application.com/**business_name**
for user with many businesses: http://www.application.com/user/1/businesses

我想它适合你

业务
控制器中,在过滤器前添加一个过滤器,并放入逻辑

before_filter :check_status

private
    def check_status
        if @user.businesses.blank?
          redirect_to new_user_business_path(@user)
        elsif @user.businesses.count == 1
          redirect_to business_path(@user.businesses.first)              
        end
    end

它应该只在控制器中!您正试图从哪个页面或控制器操作执行此操作?您希望从哪个页面/情况显示此详细信息?您正在运行哪个版本的Rails?这不是Rails版本的问题,而是MVC体系结构的问题
before_filter :check_status

private
    def check_status
        if @user.businesses.blank?
          redirect_to new_user_business_path(@user)
        elsif @user.businesses.count == 1
          redirect_to business_path(@user.businesses.first)              
        end
    end