【发布时间】:2009-09-06 20:06:33
【问题描述】:
我创建了一个应用程序,该应用程序具有多个模型(例如 A、B),这些模型以多态方式与 Comment 模型相关联。当查看与 A 控制器关联的页面时,与 A 对象关联的 show action、cmets 显示为创建新对象的表单。所有这些都有效,类似于 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
查看 cmets 和表单的部分内容(使用 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/cmets,当我希望它渲染 a/2 时。
最新解决方案:
def create
subject = ""
if !@comment.save
subject = "?subject=#{@comment.subject}"
end
redirect_to @back + subject
end
然后在A控制器中显示动作:
if params.has_key?('subject')
@comment = Comment.create(:subject => params[:subject])
else
@comment = Comment.new
end
这可行,但感觉有点难看......
【问题讨论】:
标签: ruby-on-rails