一个型号和控制器,但在rails3中略有不同的视图和路径

时间:2010-10-11 00:40:34

标签: ruby-on-rails model-view-controller ruby-on-rails-3 controller routes

我有一个模型通知,它基本上处理相同的一些事情。一个简单的联系表格,一个邀请表格等。它们都有相同的通用项目......即姓名,电子邮件,评论,等等。

可能会有一个稍微不同的字段,但它们是可选的,所以我想将它们视为一个带有差异化字段的模型:notification_type所以邀请或反馈等等只会呈现不同的视图我在通知(通知/邀请/)下的子文件夹中创建。

我的路线中有这样的东西可以正常工作:

路由

resources :notifications
match 'invites' => 'notifications#new', :defaults => { :notification_type => 'invitation' } 

我传递了notification_type ...

new.html.erb

<% if params[:notification_type] or params[:notification][:notification_type] == "invitation" %>
 <%= render "notifications/invitations/form" %>
<% end %>

form.html.erb

我为notification_type

传递了一个隐藏字段
<%= f.input :notification_type, :as => 'hidden', :input_html => { :value => @notification.notification_type ||= params[:notification_type] } %>

这一切似乎都有效..唯一需要注意的是,如果他们创建了一个错误,它会将它们发送到/notification路径而不是邀请...但它仍然可以正常工作,但我想知道它有一个更简单的方法来做同样的事情?从控制器层内?我觉得有些事情会让我后来感到惊讶。

1 个答案:

答案 0 :(得分:0)

我在模型中做继承并有两个控制器。我的控制器尽可能小,所以通常我可以添加很多控制器。但这是形式错误之外的一个非常简洁的解决方案。我认为你的预感可能是正确的,因为它变得更加复杂。

所以要明确,我必须模拟邀请和反馈。每个模型都将set_table_name设置为“notifications”,继承自Notification,然后在initialize方法中设置默认通知,或者使用您已经在路由中使用的:defaults块。这是一个更加灵活和明确的imo。