【问题标题】:Pattern to avoid coupling between controller actions of parent and child controllers避免父子控制器的控制器动作之间耦合的模式
【发布时间】:2012-12-18 10:54:22
【问题描述】:

假设您有一个Question 和一个Answer 模型,并且新答案是从questions#show 页面(如 StackoverFlow)提交的。

除非questions#showanswers#create 操作加载相同的数据,否则如果新答案出现验证错误,answers#create 将抛出异常(通常在 nil 类上没有方法)。这不是一个主要问题,但是当您添加过滤器和其他类型的数据时,代码开始有异味,并且您会在两个操作之间获得紧密耦合。改变一个需要改变另一个——这很容易忘记。

我想知道有经验的 Rails 开发人员会做些什么来避免这种耦合?

  # Assume Discussion = Question, and Response = Answer
  # Discussions#show
  def show
    @discussion = Discussion.find(params[:id]) # The question
    @responses = @discussion.responses.includes(:author) # Existing answers
    @response = @discussion.responses.build # New answer object for the form
    order = 'users.role'
    if params[:filter].present?
      order = case params[:filter]
      when 'new'
        then 'responses.created_at DESC'
      end
    end
    @responses = @responses.order(order)
  end

现在让我们看看responses#create 操作,它必须加载相同的数据才能使render 工作(如果验证失败):

  # Responses#create
  def create
    # @discussion is loaded using a before filter
    @response = @discussion.responses.build(params[:response])
    @response.author = current_user
    @responses = @discussion.responses.includes(:author)
    order = 'users.role'
    if params[:filter].present?
      order = case params[:filter]
      when 'new'
        then 'responses.created_at DESC'
      end
    end
    @responses = @responses.order(order)
    respond_to do |format|
      if @response.save
        format.html { redirect_to @discussion }
        format.js
      else
        format.html { render 'discussions/show' } # fails if discussions#show and responses#new do not load the same data.
      end
    end
  end

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 dry code-duplication


    【解决方案1】:

    您的问题似乎是不相关的控制器操作之间的耦合非常紧密,因为 answers#create 也试图成为一个讨论#show。

    一种选择是在验证错误和成功时重定向到@discussion,并将提交的答案参数传递给重定向。然后您可以处理问题显示操作中有答案数据的“特殊”情况。

    【讨论】:

      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-15
      • 2017-11-05
      • 2017-12-18
      相关资源
      最近更新 更多