我创建了一个应用程序,该应用程序具有多个与评论模型呈多态关联的模型(称为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