Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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 On Rails 3_Dry - Fatal编程技术网

Ruby on rails 这是不是太干了,我是不是太过分了?

Ruby on rails 这是不是太干了,我是不是太过分了?,ruby-on-rails,ruby-on-rails-3,dry,Ruby On Rails,Ruby On Rails 3,Dry,我一直在干燥一些代码,其中一个重构如下: 我有3个控制器(建筑公司、房地产公司、人员),它们都有以下模式: class ConstructionCompaniesController < ApplicationController before_filter :correct_user, :only => [:edit, :update] private def correct_user @company = ConstructionCompany.find(param

我一直在干燥一些代码,其中一个重构如下:
我有3个控制器(建筑公司、房地产公司、人员),它们都有以下模式:


class ConstructionCompaniesController < ApplicationController
before_filter :correct_user, :only => [:edit, :update]

private
   def correct_user
      @company = ConstructionCompany.find(params[:id]) 
      if(current_user.owner != @company.user)
        redirect_to(root_path)
      end
    end   
正如您所见,每个控制器中都会重复使用正确的用户。
因此,我在I helper中所做的是为它们创建了一个方法:


def correct_user_for_seller_of_controller(controller)
    #"User".classify will return the class User etc.
    @seller = controller.controller_name.classify.constantize.find(params[:id])     
    redirect_to(root_path) unless (current_user == @seller.user)
  end                            
了解我拥有的每个控制器的内部:


class ConstructionCompaniesController < ApplicationController

  before_filter :only => [:edit, :update] do |controller| correct_user_for_seller_of_controller(controller) end           


我喜欢现在已经干涸的事实,但问题是它对我来说似乎有点复杂,难以理解。我是不是走得太远了?

清理一下肯定很好。我想你可能把事情弄得比必要的稍微复杂一点,但是,所有的过程都是这样


如果过滤器在控制器的实例上运行,则无需将控制器传递给自身。只需在方法中调用
controller\u name
,您就可以开始了。

将其清理干净绝对是件好事。我想你可能把事情弄得比必要的稍微复杂一点,但是,所有的过程都是这样


如果过滤器在控制器的实例上运行,则无需将控制器传递给自身。只要在方法中调用
controller\u name
,就可以了。

我会亲自将其干燥一点,然后将过滤器移动到超类(或AppApplicationController)


这种方法本身也肯定可以简化。例如,使用一些内省。

我个人会将其再干燥一点,然后将过滤器移动到超类(或AppApplicationController)


这种方法本身也肯定可以简化。例如,使用一些内省。

correct\u user
方法添加到
ApplicationController
类中

class ApplicationController
  def correct_user_for_seller_of_controller
    #"User".classify will return the class User etc.
    @seller = controller_name.classify.constantize.find(params[:id])     
    redirect_to(root_path) unless (current_user == @seller.user)
  end  
end
在控制器中,将新方法用作过滤器方法:

class RealEstateCompaniesController < ApplicationController

 before_filter :correct_user_for_seller_of_controller, :only => [:edit, :update]

end
class RealestateCompanysController[:编辑,:更新]
终止

correct\u user
方法添加到
ApplicationController
类中

class ApplicationController
  def correct_user_for_seller_of_controller
    #"User".classify will return the class User etc.
    @seller = controller_name.classify.constantize.find(params[:id])     
    redirect_to(root_path) unless (current_user == @seller.user)
  end  
end
在控制器中,将新方法用作过滤器方法:

class RealEstateCompaniesController < ApplicationController

 before_filter :correct_user_for_seller_of_controller, :only => [:edit, :update]

end
class RealestateCompanysController[:编辑,:更新]
终止

是的,self.controller\u name这样我就可以去掉这个参数了,但我还是要做self.controller\u name.classify。constantize@daniel当前位置积木非常凌乱。这个小方法链非常好,特别是因为它只使用了一次。是的,self.controller\u name,这样我就可以去掉这个参数,但是我仍然需要做self.controller\u name.classify。constantize@daniel当前位置积木非常凌乱。这个小方法链非常好,特别是因为它只使用过一次。是的,好主意,我将修改更多代码,使用一些内省,并将所有控制器的编辑和更新验证移到ApplicationController,应该是6或7lines@daniel:如果您肯定不打算在不久的将来制造更多控制器,则仅将
before_filter
位移动到应用程序控制器。只是提醒一下:)@Matchu正是我的意思;)是的,好主意,我会修正一些代码,使用一些内省,并将所有控制器的编辑和更新验证移到ApplicationController,应该是6或7lines@daniel:如果您肯定不打算在不久的将来制造更多控制器,则仅将
before_filter
位移动到应用程序控制器。只是提醒一下:)@Matchu正是我的意思;)@坎达达博古:我甚至没看到。哇,接得好,这是一个大a**,很难错过…:-)@坎达达博古:我甚至没看到。哇,接得好,这是一个大a**,很难错过…:-)