扩展Redmine用户模型

问题描述:

我是Ruby on Rails的新手,我试图创建一个插件。作为第一步,我试图用新的表单字段修改用户帐户页面。到目前为止,我有这个领域,如果我在数据库中手动插入数据,它会被预填充,但是,我无法获取它保存输入的数据。我正在使用view_my_account钩子。我的补丁中也使用了validates_presence_of验证设置。它抛出当我提交一个空场的错误,和填充的字段 - 我猜,因为现场没有正确与@user.save在管理平台扩展Redmine用户模型

连接

这里就是我有:

init.rb

require 'redmine' 

# Patches to Redmine Core 
require 'user_patch' 

# Hooks 
require_dependency 'account_view_hook' 

Redmine::Plugin.register :myTest do 
# all plugin info 
end 

插件/ MYTEST/LIB/user_patch.rb

require_dependency 'user' 

module UserPatch 
    def self.included(base) 
     base.extend(ClassMethods) 

     base.send(:include, InstanceMethods) 

     base.class_eval do 
      unloadable 

      validates_presence_of :my_new_field 

     end 
    end 

    module ClassMethods 
    end 

    module InstanceMethods 
    end 
end 

ActionDispatch::Callbacks.to_prepare do 
    User.send(:include, UserPatch) 
end 

插件/ MYTEST/LIB/account_view_hook.rb

class AccountViewHook < Redmine::Hook::ViewListener 
    render_on :view_my_account, :partial => 'account/my_new_field' 
end 

插件/ MYTEST /应用/视图/帐号/ _my_new_field.html.erb

<p><%= form.text_field :my_new_field, :required => true %></p> 

和原始页面入我挂钩(管理平台/应用/视图/我的/ account.html .erb)

<div class="contextual"> 
<%= additional_emails_link(@user) %> 
<%= link_to(l(:button_change_password), {:action => 'password'}, :class => 'icon icon-passwd') if @user.change_password_allowed? %> 
<%= call_hook(:view_my_account_contextual, :user => @user)%> 
</div> 

<h2> 
    <%= avatar_edit_link(@user, :size => "50") %> 
    <%=l(:label_my_account)%> 
</h2> 

<%= error_messages_for 'user' %> 

<%= labelled_form_for :user, @user, 
        :url => { :action => "account" }, 
        :html => { :id => 'my_account_form', 
           :method => :post } do |f| %> 
<div class="splitcontentleft"> 
<fieldset class="box tabular"> 
    <legend><%=l(:label_information_plural)%></legend> 
    <p><%= f.text_field :firstname, :required => true %></p> 
    <p><%= f.text_field :lastname, :required => true %></p> 
    <p><%= f.text_field :mail, :required => true %></p> 
    <% unless @user.force_default_language? %> 
    <p><%= f.select :language, lang_options_for_select %></p> 
    <% end %> 
    <% if Setting.openid? %> 
    <p><%= f.text_field :identity_url %></p> 
    <% end %> 

    <% @user.custom_field_values.select(&:editable?).each do |value| %> 
    <p><%= custom_field_tag_with_label :user, value %></p> 
    <% end %> 
    <%= call_hook(:view_my_account, :user => @user, :form => f) %> 
</fieldset> 

<%= submit_tag l(:button_save) %> 
</div> 

<div class="splitcontentright"> 
<fieldset class="box"> 
    <legend><%=l(:field_mail_notification)%></legend> 
    <%= render :partial => 'users/mail_notifications' %> 
</fieldset> 

<fieldset class="box tabular"> 
    <legend><%=l(:label_preferences)%></legend> 
    <%= render :partial => 'users/preferences' %> 
    <%= call_hook(:view_my_account_preferences, :user => @user, :form => f) %> 
</fieldset> 

</div> 
<% end %> 

<% content_for :sidebar do %> 
<%= render :partial => 'sidebar' %> 
<% end %> 

<% html_title(l(:label_my_account)) -%> 

新字段必须先添加到模型中。

通常在Ruby on Rails中您必须生成并运行migration,然后才能执行现场执行。

但是,Redmine支持其模型扩展,无需迁移,甚至无需编程。如果您想要将字段添加到user模型,请使用可在Redmine管理设置中添加的custom fields。立即在user表格中显示新字段,而不重新启动。

当然,您可以使用视图钩子来查看字段,并根据需要更改标准字段的标准执行。有关如何使用自定义字段值,请参阅我的answer

+0

谢谢你。我确实在数据库中运行了一个宝贝迁移新领域。我已经阅读过有关自定义字段的内容,但很想好好利用迁移来完成它。在那种情况下,我错过了什么? – djt

+0

你能显示迁移代码吗?迁移是否成功并添加了字段?另外我认为你必须在保存之前在'''​​UsersController'''中设置字段值(在''''''''''''和'''''''''方法) –

+0

用户在@ user.safe_attributes = params [ :用户]在'''UsersController'''中的行。也许你的领域无法获得价值,因为这一行 - 它内部调用delete_unsafe_attributes方法,可能会将你的价值降低为不安全 –