用户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
。
在challenge_controller中,我可以这样做:
@challengers = User.all
@challenger = User.find(params[:challenger_selected]) if (params[:challenger_selected]).present?
@challenger_challenges = @challenger.challenges
然后,我只需要一种方法来刷新页面,一旦选择了用户,以便用户ID作为:challenger_selected
无需页面刷新即可实现此问题的目标。 *优选的
根据以下评论,我意识到我需要详细说明。
用户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
答案 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/
,具体取决于你想要如何设计它。最后/
很重要。