Rails 4:form_for与嵌套资源,没有

时间:2014-04-04 20:52:50

标签: ruby-on-rails

在我的应用中,当普通用户登录时,会将其放入显示他们belong_to公司的服务请求的信息中心上。

当管理员登录时,它们会被放到仪表板上,该仪表板显示可以登录并提交服务请求的所有公司徽标。

普通用户和管理员用户之间的视图几乎完全相同,在表单上的一个或两个实体之外(通过cancan控制)。因此,如果管理员创建SR或普通用户创建SR,我试图能够使用相同的表单。

routes.rb中:

  resources :service_requests do
    resources :notes
  end

  namespace :admin do
    get '', to: 'dashboard#index', as: '/'

    resources :companies do
      resources :service_requests, only: [:index, :new]
    end
  end

如果管理员登录并单击公司徽标并单击以创建新SR,则路由为/admin/companies/1/service_requests/new。如果常规用户登录为/service_requests/new。我对如何为管理员和非管理员方重用相同的表单感到有点困惑。因为我在company_id

中的创建资源中设置了SR上的ServiceRequestsController

1 个答案:

答案 0 :(得分:0)

我执行以下操作,使用admin上的相同表单和使用not admin的{​​{1}}

cancan

在您的表单所在的视图文件上,类似

#models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    if user.is_admin? #replace this by something that returns true if logged-in user is admin
      can :generate_this_form_fields, User
      # ^ normally can -> points to a method in the controller, but you can
      # create one even if you're not validating any method, just so you could use it anywhere
    end
  end
end

实际上在视图中,您可以使用

#views/form.html.erb
<%= form_tag ... %>
  <% if can? :generate_this_form_fields, User %>
    This is where the fields are displayed if admin account
  <% else %>
    This is where the fields are displayed if not admin
  <% end %>
<% end %>

而不是

<% if current_user.is_admin? %>

但我已经以这样的方式做出了这样的例子,可能适合你想要解决的问题。 希望这可以帮助。干杯!