扩展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。
谢谢你。我确实在数据库中运行了一个宝贝迁移新领域。我已经阅读过有关自定义字段的内容,但很想好好利用迁移来完成它。在那种情况下,我错过了什么? – djt
你能显示迁移代码吗?迁移是否成功并添加了字段?另外我认为你必须在保存之前在'''UsersController'''中设置字段值(在''''''''''''和'''''''''方法) –
用户在@ user.safe_attributes = params [ :用户]在'''UsersController'''中的行。也许你的领域无法获得价值,因为这一行 - 它内部调用delete_unsafe_attributes方法,可能会将你的价值降低为不安全 –