2012-08-09 127 views
0

我幾乎使用了常規腳手架的代碼。唯一的變化是4次塊,我在這個問題上做出4個答案對象。原因是我在視圖中有相應的輸入字段。現在,如果驗證失敗,它會再次呈現new.html.erb,但是在我閱讀它之後不會再次調用「new」動作。但是,我依賴於4.times塊,因爲否則視圖中的循環沒有循環的答案。我該如何解決?我嘗試重定向,但隨後錯誤消息消失了。渲染不運行

新動作

def new 
    @question = Question.new 

    4.times do 
     @question.answers.build 
    end 

    respond_to do |format| 
     format.html # new.html.erb 
     format.json { render json: @question } 
    end 
    end 

創建行動

def create 
    @question = Question.new(params[:question]) 

    respond_to do |format| 
     if @question.save 
     format.html { redirect_to @question, notice: 'Question was successfully created.' } 
     format.json { render json: @question, status: :created, location: @question } 
     else 
     format.html { render action: "new" } 
     format.json { render json: @question.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

回答

0

正如您的標題所暗示的那樣:render只會呈現(模板屬於)該動作並且不會執行動作本身。

爲了讓您的預構建答案在失敗的創建調用中再次呈現,我建議從嵌套屬性設置中刪除:reject_if條件。這樣,空提交的答案被保留。爲了防止他們被寫入數據庫,只需將常規驗證添加到問題模型中...

+0

嗨,但我有4個輸入字段..並且用戶可能並不總是有4個答案,它可能只有2個,所以如果用戶沒有填寫所有4,那麼不檢查答案文本是否失敗? – LuckyLuke 2012-08-09 12:58:01

+0

我解決了它。我添加了回調,並刪除了拒絕條件。 – LuckyLuke 2012-08-09 13:39:05

+0

很高興它解決了:) – severin 2012-08-10 09:50:40

0

你需要看看在你創建行動@question。理論上它應該包含4個新建的答案,因此重新顯示錶單也會包含這些答案。

如果它們沒有寫入,則可能需要查看accepts_nested_attributes_for以確保它從請求中正確地反序列化。

+0

我有這個:'accepted_nested_attributes_for:answers,:reject_if =>:reject_empty_answers'和方法檢查描述字段是否爲空。所以我應該添加一個回調,而不是從問題對象中刪除空的答案?只有當對象被正確保存時纔可以解決這些問題。 – LuckyLuke 2012-08-09 11:56:24