【问题标题】:Accessing a parameter within a plugin访问插件中的参数
【发布时间】:2009-12-05 19:34:00
【问题描述】:

我正在尝试修改 vestal_versions 插件以接受我在保存时设置的参数。此参数将作为一个新标志来确定何时在更新时创建修订。目前,当需要新修订时,它将始终在更新时运行。以下是未修改插件代码的受影响区域:

after_update :create_version, :if => :needs_version?

    def create_version
        versions.create(:changes => changes.slice(*versioned_columns), :number => (last_version + 1))
        reset_version
    end 

提交时我在视图中发送的参数是“forcerevision=n”。我将如何提取此参数以及我将使用什么条件来允许它仅在“forcerevision = y”时运行?修改 after_update 过滤器似乎最干净?

这是更新时传递的数据的日志。

Processing NotesController#update (for 521.0.0.1 at 2009-12-05 13:25:45) [PUT]
Parameters: {"authenticity_token"=>"#########################+k=", "id"=>"4", "forcerevision"=>"n", "note"=>{"notebook_id"=>"", "public"=>"n", "body"=>"A versioned note", "title"=>"Version Note Test", "flag"=>"important", "star"=>"false", "tag_list"=>""}}

vestal_versions on Github

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-plugins


    【解决方案1】:

    最简洁的方法是在声明模型为版本控制时添加 attr_accessor。

    然后覆盖需求版本?检查该属性。

    在 LaserLemon::VestalVersions::ClassMethods#versioned 的任何地方添加这一行:

    attr_accessor :force_reversion
    

    然后重写 LaserLemon::VestalVersions::InstanceMethods#needs_version?检查此属性:

    注意由于处理复选框的方式,“0”对于复选框和布尔字段被认为是假的,但在 ruby​​ 中是一个真值。所以我们不能只检查 force_reversion 是否评估为 false。

    def needs_version?
      !(versioned_columns & changed).empty? || 
        ![nil, "0", 0, false].include?(force_reversion)
    end
    

    一切就绪。只需将 force_reversion 的任何值作为列传递即可。

    经过以上修改后采用以下模型:

    类用户

    @user.update_attributes(:force_reversion => true, :unversioned_column => new_value)
    

    或以一种形式:

    <%= form_for @user do |f| %>
      <%= f.label :force_reversion, "Force New Version" %>
      <%= f.check_box :force_reversion %>
      ... More fields ...
    <% end %>
    

    【讨论】:

    • 非常感谢您的深入回答。它工作得很好!只是这样我可以更好地理解这一点,为什么 attr_accessor 需要放置在指定的位置而不是例如在 LaserLemon::VestalVersions 中?
    • 这与模块在 include 上的处理方式有关。加载插件时,它会修改 ActiveRecord::Base 的所有后代。通过将其放置在 LaserLemon::VestalVersions::ClassMethods#versioned 中,attr_accessor 仅添加到需要它的模型中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-09
    • 2016-07-10
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多