我正在使用Devise和Active Admin,到目前为止,他们在一起玩得很好。我没有使用默认的Active Admin"AdminUser",而是使用我自己的"User"模型,有时在我的应用程序中被称为"Author"。
我正在创建一个文章表单(创建/更新),并且我有一个用户选择框,如果记录是更新,则该框是预先选择的,但如果是新记录则不会。我想做的是,如果我正在创建一个新记录,请使用Devise"current_user"。由于ActiveAdmin使用Formtastic,我发现:https://github.com/justinfrench/formtastic/wiki/Deprecation-of-%3Aselected-选项,这基本上解释了这可能是一个即将推出的功能,但这可能最好通过前置过滤器来实现,这就是我现在遇到的问题。
这是我的表单视图:
<%= 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>
但这会覆盖"编辑"视图中的选定用户,在该视图中已分配了作者/用户。。。而且它看起来也不像Rails方式。。。
编辑:我发现:活动管理员:只自定义新表单
因此,在我看来,基于此,我确定文章是否是新记录,如果是,我会包装javascript,以便将其放在新文章的页面上。这样,在文章更新时,用户仍然处于选中状态。
<% if controller.action_name == 'new' %>
<script type="text/javascript">
$(document).ready(function() {
$('#article_user_id').val(<%= current_user.id %>);
});
</script>
<% end %>
同样,我不认为这是最优雅的解决方案,所以如果有人对更好的方法有任何意见(我相信有),请告诉我!
在控制器中使用before_filter。。。
controller do
before_filter :assign_user, :only => :new
private
def assign_user
resource.user = current_user
end
end
这样,当您的表单被呈现时,@article将已经通过对resource方法的调用填充了用户id(在您的情况下,它引用@article)。