とモデルがあり、新しい回答がページから送信されたQuestion
と仮定します(StackoverFlowなど)。Answer
questions#show
questions#show
とanswers#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