在“用户选择”框中使用“设计当前用户”作为默认用户

时间:2012-03-20 15:31:29

标签: ruby-on-rails activerecord devise formtastic activeadmin

我使用的是Devise和Active Admin,到目前为止,我们一起玩得很好。我没有使用默认的Active Admin" AdminUser',而是使用我自己的用户'模型,有时被称为'作者'在我的应用程序中。

我正在创建文章表单(创建/更新),如果记录是更新,我有一个预先选择的用户选择框,但如果是< em>新记录。我想要做的是如果我正在创建一个新记录,请使用Devise&#39; &#39; CURRENT_USER&#39 ;.由于ActiveAdmin正在使用Formtastic,我发现了这个:https://github.com/justinfrench/formtastic/wiki/Deprecation-of-%3Aselected-option,它基本上解释了可能是一个功能即将到来,但这可能最好通过前过滤器实现,这是我现在难倒的地方。

这是我的表单视图:

<%= semantic_form_for [:admin, @article] do |f| %>
    <%= f.inputs "Details" do %> 
        <%= f.input :title %>
        <%=
            f.input :user, :as => :select, :label => 'Author',
            :collection => User.all, :include_blank => false,
            :required => true 
        %>

        <%=
            f.input :categories, :as => :check_boxes, :label => 'Categories',
            :collection => Category.all, :include_blank => 'None',
            :hint => 'Choose all categories that apply.',
            :required => false 
        %>

        <%= f.input :desc, :label => 'Description' %>
        <%= f.input :content, :label => 'Content' %>
    <% end %>
    <%= f.buttons %>
<% end %>

我可以使用jQuery预先选择 current_user ,如下所示:

<script type="text/javascript">
  $(document).ready(function() {
    $('#article_user_id').val(<%= current_user.id %>);
  });
</script>

但是这会覆盖&#39;编辑&#39;中的所选用户。视图,其中已经分配了作者/用户......并且它似乎也不像Rails方式...

修改 我找到了这个: Active Admin: Customize only new form

基于此,在我看来,我确定文章是否是新记录,如果是,我将包装javascript,以便将其放在新文章的页面上。这样,在文章更新时,用户仍处于选中状态。

<% if controller.action_name == 'new' %>
  <script type="text/javascript">
  $(document).ready(function() {
    $('#article_user_id').val(<%= current_user.id %>);
  });
  </script>
<% end %>

同样,我不认为这是最优雅的解决方案,所以如果有人对更好的方式有任何意见(我确定有),请告诉我!

1 个答案:

答案 0 :(得分:3)

在控制器中使用before_filter ...

controller do
  before_filter :assign_user, :only => :new

  private

  def assign_user
    resource.user = current_user
  end
end

这样,当你的表单被渲染时,@ article会通过调用资源方法(在你的情况下引用@article)填充用户id。