簡體   English   中英

rails respond_with相關記錄

[英]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

說明:在我看來,在一個控制器中處理邏輯而不是兩個控制器的決定歸結為您認為是感興趣的資源。 通常,您會考慮每個模型來表示不同的資源,從而創建一個單獨的控制器來處理與每個資源相關的操作。 但是,當存在多個深度耦合的模型時,在單個視圖中處理多個動作(例如shownewcreate ),將模型視為形成單個資源可能更清晰。

在這個例子中,我覺得資源作為一項集體同時包含問題和答案的。 由於這個集體資源是由問題本身唯一標識的,我會讓問題控制器處理它。 問題控制器中的show動作已經涉及檢索集體問答資源,因此您可能會將answer操作(以及可能的unanswerreanswer執行操作)視為對該集合資源的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM