1

とモデルがあり、新しい回答がページから送信されたQuestionと仮定します(StackoverFlowなど)。Answerquestions#show

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
4

1 に答える 1

1

Answers#create もdiscussions#showになろうとしているため、関連のないコントローラーアクション間で非常に密接な結合があることが問題のようです。

1 つのオプションは、検証エラーと成功時に @discussion にリダイレクトし、送信された回答パラメーターをリダイレクトに渡すことです。次に、質問の表示アクションに回答データがあるという「特別な」ケースを処理できます。

于 2012-12-18T16:10:05.113 に答える