选择用户,然后下拉他的挑战

时间:2017-02-22 12:15:12

标签: javascript jquery ruby-on-rails ruby

用户has_many提出质疑。

选择用户后......

<%= f.select :user_id, options_for_select(@challengers.collect { |challenger| [challenger.full_name] }) %>

......我们怎么能用他的挑战列表显示另一个下拉列表?

<%= f.select :challenge_id, options_for_select(@challenger_challenges.collect { |challenged| [challenged.full_challenge]}) %>

换句话说,我们如何才能使“@challenger_challenges =所选用户的挑战”?

由于undefined method 'collect' for nil:NilClass@challenger_challenges,我收到错误nil

选项1

在challenge_controller中,我可以这样做:

@challengers = User.all
@challenger = User.find(params[:challenger_selected]) if (params[:challenger_selected]).present?
@challenger_challenges = @challenger.challenges

然后,我只需要一种方法来刷新页面,一旦选择了用户,以便用户ID作为:challenger_selected

在参数中传递

选项2

无需页面刷新即可实现此问题的目标。 *优选的

更新

根据以下评论,我意识到我需要详细说明。

用户has_many提出质疑。

用户可以创建duel

duel中有两个duelers

duel的创建者选择他自己的:challenge_id,然后他选择另一个正确者以及他的:challenge_id之一,然后设置@duel.consequence如果他没有接受他的挑战就必须这么做。另一个人将收到决斗请求通知,然后可以选择接受或拒绝决斗的条件。

challenges.show.html.erb

<%= render 'duels/form' %>

决斗/ _form.html.erb

<%= simple_form_for(@duel) do |f| %>
  <%= f.fields_for :duelers do |dueler| %> 
    <%= f.hidden_field :challenge_id, :value => @challenge.id %>
    <%= @challenge.full_challenge %>
  <% end %>
  <%= f.fields_for :duelers do |dueler| %>
    <%= render 'duels/dueler_fields', :f => dueler %>
  <% end %>
  <%= button_tag(type: 'submit', class: "btn", id: "challenge-create-save")  do %>
    Request Duel
  <% end %>
<% end %>

决斗/ _dueler_fields.html.erb

<%= f.select :user_id, options_for_select(@challengers.collect { |challenger| [challenger.id] }) %>

# Trying to make this responsive to the user that is selected above
<%= render 'challenges/select', :f => f %>

<script>
$('#duel_duelers_attributes_1_user_id').change(function () {
    var challenger_id = $(this).find(":selected").val();
    var address = "<%= select_path %>".concat(challenger_id);
    $.get(address, function(data) {
        $("#duel_duelers_attributes_1_challenge_id").html(data);
    });
});
</script>

路由

get 'challenges/select/:id' => 'challenges#select', as: 'select'

挑战/ _select.html.erb

<%= f.select :challenge_id, options_for_select(@challenger_challenges.collect { |challenged| [challenged.full_challenge]}) %>

challenges_controller

def select
  if (params[:challenger_id]).present?
    @challenger = User.find(params[:challenger_id])
  else
    @challenger = User.find(1)
  end
  @challenger_challenges = @challenger.challenges
end

1 个答案:

答案 0 :(得分:1)

应该归功于@Fallenhero - 我只是更详细地解释它。

您需要能够识别选择标记。

<%= f.select ..., :html => {:id => :first} %>

你还需要在某处放置第二个。

<div id="second"></div>

使用jQuery:

$('#first').change(function () {
    var challenger_id = $(this).find(":selected").val();
    var address = "<%= [prints address to new select tag] %>".concat(challenger_id);
    $.get(address, function(data) {
        $("#second").html(data);
    });
});

Ruby打印出来的地址应该看起来像challenges/select/,具体取决于你想要如何设计它。最后/很重要。