2012-10-19 47 views
0

我有一個文章模型和一個評論模型。我目前有兩個單獨的表單來創建新評論:一個允許用戶指定他們評論的文章名稱,另一個在文章展示視圖下方爲該文章創建新評論。我在第一種情況下使用form_for @comment,在第二種情況下我使用form_for [@article,@comment]。當用戶將文章名稱指定爲字符串時,我會在保存評論之前將其轉換爲文章ID。Rails:創建用戶指定關聯的表單和基於當前資源的表單

我的路線是

resources :comments 

resources :articles do 
    resources :comments 
end 

對於第二種形式我怎麼能重定向迴文章保存失敗的評論(校驗和錯誤應顯示)?對於第一種形式,我只是重定向到主頁,因爲這是我的第一個評論形式。

此外,我有第一種形式驗證文章名稱字段不能爲空。如何刪除第二種形式的驗證,因爲用戶不需要指定文章名稱?

我在comments_controller中的新函數處理這兩種形式。如何確定在控制器中提交哪種表單?

在此先感謝。

回答

2

實際上,重定向不是走這裏的路,我會說。 Rails中的錯誤和驗證處理通常以您使用驗證的對象重新呈現createupdate方法中的表單而不是實際重定向到newedit頁面的方式工作。

至於你的兩個版本的註釋保存問題,我會在兩個版本中使用form_for @comment。轉儲嵌套表單版本可以在表單中用給定的文章字符串模擬用戶的行爲。這樣你就可以省掉很多if-else語句。

至於渲染驗證錯誤部分,你可以簡單地檢查你的params中是否有article_id(這意味着你通過給定的文章創建/更新評論)或者不(這意味着你有第一個版本) 。

一些代碼來闡述:

# routes.rb 
# keep the routes as they are 
resources :comments 
resources :articles 
    resources :comments 
end 

# CommentsController.rb 
def new 
    # don't use build 
    @comment = Comment.new 

    # get the article, if there is one to get 
    @article = Article.find(params[:article_id]) if params[:article_id] 

    # get all articles if there is no single one to get 
    @articles = Article.all unless params[:article_id] 
end 

def create 
    # fetch article id from title (in any case) 
    # I'm assuming here 
    params[:comment][:article_id] = fetch_article_id_from_title(params[:comment][:article_title]) 

    @comment = Comment.new(params[:comment]) 
    if @comment.save 
    redirect_to everything_worked_fine_path 
    else 
    # render the new view of the comments and actually 
    # forget the article view. Most sites do it like this 
    render action: "new" 
    end 
end 

# form partial 
<%= form_for @comment do |f| %> 
    <% if @article %> 
    # there's an article to save this comment for 
    <%= f.hidden_field :article_title, @article.title # I'm assuming here 
    <% else %> 
    # this means there's no particular article present, so let's 
    # choose from a list 
    <%= f.select ... %> 
    <% end %> 
<% end %> 

希望這有助於。

+0

我不確定你是否只是爲了這個解釋的明確性而這樣做,但你也可以快捷你的*渲染動作:「新」*只是*渲染*:新* – adimitri

+0

是的,我做了,但謝謝你:) – Vapire

相關問題