我創建了一個應用程序,該應用程序具有多個與評論模型呈多態關聯的模型(稱爲A,B)。當查看與A控制器關聯的頁面時,顯示動作,與A對象關聯的註釋將以創建新對象的形式顯示。所有這些工作都與Ryan Bates在rails網站上發佈的15分鐘博客類似。但是,如果我添加驗證以確保用戶不提交空白評論,我不確定如何呈現該評論。下面是我在我的評論控制器:多態註釋,當註釋驗證失敗時如何渲染?
before_filter :load_resources, :only => [:create]
def create
if @comment.save
redirect_to @back
else
render @action
end
end
private
def load_resources
@comment = Comment.new(params[:comment])
case @comment.commentable_type
when 'A'
@a = A.find(params[:a_id]
@comments = @a.comments
@back = a_url(@comment.commentable_id)
@resource = @a
@action = 'as/show'
when 'B'
...
end
end
查看局部徵求意見和形式(使用Haml的):
=render :partial => 'comments/comment', :collection => @comments
%h3 Leave a comment:
-form_for [@resource, Comment.new] do |f|
=f.error_messages
=f.hidden_field :commentable_type, :value => params[:controller].singularize.titleize
=f.hidden_field :commentable_id, :value => params[:id]
=f.hidden_field :editor_id, :value => @current_user.id
=f.hidden_field :creator_id, :value => @current_user.id
%fieldset
=f.label :subject, 'Subject', :class => 'block'
=f.text_field :subject, :class => 'block'
=f.label :text, 'Comment', :class => 'block'
=f.text_area :text, :class => 'block'
.clear_thick
=f.submit 'Submit', :id => 'submit'
我似乎可以找出是如何處理驗證錯誤。當驗證錯誤被觸發時,它似乎不會觸發f.error_messages。此外,當渲染被觸發時,它會將用戶帶到具有以下url的頁面:a/2/comments,當我希望渲染一個/ 2時。
最新的解決方案:
def create
subject = ""
if [email protected]
subject = "?subject=#{@comment.subject}"
end
redirect_to @back + subject
end
然後在控制器顯示行動:
if params.has_key?('subject')
@comment = Comment.create(:subject => params[:subject])
else
@comment = Comment.new
end
這工作,但感覺那種難看......
很不錯的解決方案。出於好奇,爲什麼不直接在表單中包含創作者和editor_id?在我看來,這是降低控制器複雜度的簡單方法。有了這個說法,視圖應該比控制器更清潔嗎? – LDK 2009-09-20 00:20:02
賽維LDK, 一般規則是你不應該信任用戶輸入。即使有隱藏字段,惡意用戶也可以將任何想要的ID注入表單中,然後將其傳遞,然後模擬另一個用戶。 通過刪除該選項,您可以使應用程序更安全。 – Carlos 2009-09-21 20:27:38