[英]rails respond_with associated record
例如,有一個Question
模型has_many :answers
我想在questions#show
#show上顯示一個新答案的表格(就像stackoverflow一樣)
路線將是這樣的:
resources :questions do
resources :answers
end
在這些情況下,顯示無效記錄的錯誤的最佳方法是什么?
問題是我無法在AnswersController
render
我需要的動作(因為它會是questions#show
AnswersController
),唯一的方法似乎是redirect_to
並在flash
hash中存儲錯誤。
它看起來像一個非常常見的場景,我相信應該有更好的方法
這可能是少數情況之一,實際上有理由將新的資源豐富的成員路由添加到QuestionsController
:
resources :questions do
post 'answer', :on => :member
end
這將識別question/:id/answer
,POST請求路由到questions#answer
,允許你將所有邏輯保存在一個控制器中:
class QuestionsController < ApplicationController
...
def show
@question = Question.find(params[:id])
end
def answer
@question = Question.find(params[:id])
@answer = @question.answers.build(params[:question][:answer])
if @answer.save
# show question with newly posted answer at url /question/:id
redirect_to @question
else
# show question with invalid editable answer at url /question/:id/answer
render 'show'
end
end
...
end
說明:在我看來,在一個控制器中處理邏輯而不是兩個控制器的決定歸結為您認為是感興趣的資源。 通常,您會考慮每個模型來表示不同的資源,從而創建一個單獨的控制器來處理與每個資源相關的操作。 但是,當存在多個深度耦合的模型時,在單個視圖中處理多個動作(例如show
, new
, create
),將模型視為形成單個資源可能更清晰。
在這個例子中,我覺得資源作為一項集體同時包含問題和答案的。 由於這個集體資源是由問題本身唯一標識的,我會讓問題控制器處理它。 問題控制器中的show
動作已經涉及檢索集體問答資源,因此您可能會將answer
操作(以及可能的unanswer
和reanswer
執行操作)視為對該集合資源的update
的類比。
以這種方式考慮資源主要是設計偏好的問題,並且將根據要求進行權衡。
您可以像這樣從AnswersController
渲染questions#show
AnswersController
:
render :template => 'questions/show'
如果要跳轉到頁面上的特定錨點,則必須在答案表單中定義:
<%= form_for(@answer, :url => question_answers_url(@question, :anchor => 'answer_form')) do |f| -%>
有一個部分具有將數據發布到answers_controller #create動作的形式。
所以,在你的問題#show page - show.html.erb中,渲染一個部分
<%= render :partial => "answers/answer_form" %>
在_answer_form.html.erb中,有一個表單,可以將數據發布到答案#create
<% form_for @answer do |f| %>
# have a text area
<% end %>
就閃光而言
在AsnwersController中
def create
@question = Question.find(params[:question_id])
@answer = Answer.build(params)
if @answer.save
flash[:notice] = "Answer was posted successfully"
else
flash[:error] = "There were a few errors please try again"
end
redirect_to question_path(@question)
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.