Rails状态验证与条件

时间:2014-05-06 15:04:29

标签: ruby-on-rails

以下是我的会员模特的一部分:

  belongs_to :team
  validates :role, inclusion: { in: %w(administrator visitor player),
    message: "%{value} is not a valid size" }, allow_nil: true
  validates :email, presence: true, uniqueness: true, on: :create 
  validates :team,  presence: true, :if => "member.role=player?"

我想让一个角色不是玩家的成员可以在不给团队的情况下订阅,但我写的代码似乎不起作用。

另外,如果只有用户选择角色中的玩家,是否可以显示团队字段?

这是成员的形式:

  <div class="field">
    <%= f.label :email %><br>
    <%= f.text_field :email %>
  </div>
  <div class="field">
    <%= f.select :role, ['visitor','administrator','player'] %>
  </div>
  <div class="field">
    <%= f.label :team_id %><br>
    <%= f.number_field :team_id %>
  </div>

2 个答案:

答案 0 :(得分:1)

validates :team, presence: { if: :player? }

def player?
    role == "player"
end

至于显示字段,它只是一些javascript,它与RoR没有任何关系。默认情况下隐藏该字段,并在角色选择字段上添加在change上触发的事件。根据值,显示或隐藏团队字段。

答案 1 :(得分:0)

对于您的表单,我还会推荐一些Javascript,就像我在下面所做的那样:

<script type="text/javascript">

$(document).ready(function() {
    // Hide the div when the page is loaded
    $('#team_field').hide();

    // Install a change handler to unhide the div if the user selects other than
    // what you want
    $('#player_type_select_box').change(function() {
        var val = this.value;
        if (val == 1 || val == 2) {
            // Hide the other input
            $('#team_field').hide();
        } else {
            // Unhide
            $('#team_field').show();
        }
    });
});

</script>

就像Robin所说,这与RoR无关,可以通过一些快速编写脚本来解决。页面加载时,您隐藏该字段。当用户选择他们所属的成员类型时,如果该值不是您想要的值,则将其隐藏起来。否则,揭示隐藏的div。