嵌套属性的条件?

我如何创建条件,如果dueler是current_user那么它将列出current_user的挑战,如果dueler是@user那么它将列出@用户的挑战?

duels_controller

 def new @user = User.find(params[:challenge_daddy]) @duel = Duel.new @duel.duelers << Dueler.new(user_id: current_user.id, user_name: current_user.name, user_last_name: current_user.last_name) @duel.duelers << Dueler.new(user_id: @user.id, user_name: @user.name, user_last_name: @user.last_name) @current_user_challenges = current_user.challenges.order(:created_at) @challenged_user_challenges = @user.challenges.order(:created_at) respond_with(@duel) end 

决斗/ _form.html.erb

    dueler %>  The loser will .   

决斗/ _dueler_fields.html.erb

  will  

如何创建条件,以便:如果:user_id等于current_user@current_user_challenges将显示在collection_select ,如果:user_id等于@user那么@challenged_user_challenges将显示?

您可以添加一些java / coffee脚本来执行此操作,因为它意味着对表单的实时更改。

将当前用户添加到数据和部分(或两个不同的collection_selects with ids):

 <%= f.select :user_id, User.order(:name).map { |user| [user.full_name, user.id] }, include_blank: true, id: "change-challenge-options", data: {current-user-id: current_user.id } %> 

添加app / assets / javascripts / challengers.coffee

 $(document).ready -> userSelect = $('#change-challenge-options') userSelect.on 'valuesChanged', -> currentUserId = $('#current-challenge-options').data('current-user-id') if(currentUserId == userSelect.val()) ... show / hide the correct fields else ... show / hide the correct fields $(window).resize #Not necessary but makes it look nicer if the lists are long. 

不知道这是否是最佳解决方案,但我在我的项目中做了类似的事情并且工作正常。

编辑:首先,您需要为视图添加两种情况的collection_select字段,并为它们提供ID:

 <%= collection_select(:dueler, :challenge_id, @current_user_challenges, :id, :full_challenge, include_blank: true), id: "current-user-challenges" %> <%= collection_select(:dueler, :challenge_id, @challenged_user_challenges, :id, :full_challenge, include_blank: true), id: "challenged-user-challenges" %> 

然后在脚本中添加:

 if(currentUserId == userSelect.val()) $('#current-user-challenges').show() $('#challenged-user-challenges').hide() else $('#challenged-user-challenges').show() $('#current-user-challenges').hide() 

这将显示/隐藏正确的字段。 我不确定如何向collection_selects添加id,但如果我的提议不起作用,只需将它们放在div或其他容器中。 给这些容器id并以相同的方式显示/隐藏它们。

除此之外,您可能还需要添加一些脚本,包括首次访问或正确重新访问表单。 所以完整的代码将是这样的:

 #page:load just makes sure the page is fully loaded before running script. #Usefull if you use turbolinks etc. $(document).on 'ready page:load' -> userSelect = $('#change-challenge-options') currentUserId = $('#current-challenge-options').data('current-user-id') $(window).on 'page:change', -> if(userSelect.val()) #All none zero values are true in js if(currentUserId == userSelect.val()) #Show the right field $('#current-user-challenges').show() $('#challenged-user-challenges').hide() else $('#challenged-user-challenges').show() $('#current-user-challenges').hide() else #Hide both fields if no user is chosen. $('#challenged-user-challenges').hide() $('#current-user-challenges').hide() $(window).resize userSelect.on 'valuesChanged', -> if(currentUserId == userSelect.val()) $('#current-user-challenges').show() $('#challenged-user-challenges').hide() else $('#challenged-user-challenges').show() $('#current-user-challenges').hide() $(window).resize 

我希望它对你有用!

这是使用javascript而不是coffee和raw html的概念的工作片段:

 var userSelect = $('#change-challenge-options'); var currentUserId = $('#current-user-id').data('user-id'); $('#challenged-user-challenges').hide(); $('#current-user-challenges').hide(); userSelect.on('change', function() { if (userSelect.val() == "0"){ $('#current-user-challenges').hide(); $('#challenged-user-challenges').hide(); } else if (userSelect.val() == currentUserId) { $('#current-user-challenges').show(); $('#challenged-user-challenges').hide(); } else { $('#challenged-user-challenges').show(); $('#current-user-challenges').hide(); } });