如何使用单选按钮并在一个表单中选择字段XOR在rails中?

时间:2016-08-02 16:58:52

标签: html ruby-on-rails forms

我的表单有一个属性的8个可选单选按钮:mvp,最后是一个选择下拉菜单。我希望用户能够按下一个相应值的单选按钮,或者不选择单选按钮并从选择下拉菜单中选择一个选项。他们无法从选择字段中选择单选按钮和选项。这是我的代码。请指教。

HTML

<%= form_for(current_user.awards.build) do |f| %>
<%= f.radio_button :mvp, 'Stephen Curry' %>
<%= f.radio_button :mvp, 'Lebron James' %>
<%= f.radio_button :mvp, 'Kevin Durant' %>
<%= f.radio_button :mvp, 'Russell Westbrook' %>
<%= f.radio_button :mvp, 'Kawhi Leonard' %>
<%= f.radio_button :mvp, 'Karl-Anthony Towns' %>
<%= f.radio_button :mvp, 'Chris Paul' %>
<%= f.select :mvp, ['Al Horford', 'Al Jefferson', 'Andre Drummond', 'Andre Igoudala','Andrew Wiggins', 'Anthony Davis', 'Austin Rivers', 'Ben Simmons', 'Blake Griffin', 'Brook Lopez', 'Carmelo Anthony', 'Chandler Parsons','Chris Bosh', 'Damian Lillard', 'Deandre Jordan', 'Demar Derozan', 'Demarcus Cousins', 'Derrick Favors', 'Dirk Nowitzki', 'Draymond Green', 'Dwight Howard', 'Dwyane Wade', 'Eric Bledsoe', 'Giannis Antetokounmpo', 'Greg Monroe', 'Goran Dragic', 'Gordon Hayward', 'Harrison Barnes','Hassan Whiteside', 'Isaiah Thomas', 'Jahlil Okafor', 'James Harden', 'James Jones','Jeff Teague', 'Jimmy Butler', 'John Wall', 'Kemba Walker','Kevin Love', 'Khris Middleton', 'Klay Thompson', 'Kristaps Porzingis', 'Kyle Lowry', 'Kyrie Irving', 'Lamarcus Aldridge', 'Marc Gasol', 'Mike Conley', 'Nerlens Noel', 'Nicolas Batum', 'Nikola Pekovic', 'Pau Gasol', 'Paul George', 'Paul Millsap','Ricky Rubio','Rudy Gobert', 'Victor Oladipo', 'Zach Lavine'],  include_blank: "Select One" %>
<%= f.submit "Submit Pick" %>

截至目前,如果我尝试填写表单,无论我在单选按钮中按什么选项,总是提交的值是选择框中的值。我在select字段的末尾添加了一个include_blank:选项,但随后提交的值只是一个空值。因此,出于某种原因,默认提交是在选择字段中选择的任何内容。

1 个答案:

答案 0 :(得分:0)

终于明白了。我不知道除了某些情况外,制作对控制器来说几乎无用的属性是多么有效,但无论如何。我使用“rails g migration add_mvp_select_to_controller mvp_select:string”生成了一个新属性,然后对我的数据库进行了调整。我将以下代码添加到控制器中的create动作

def create
  @awardprediction = current_user.awardpredictions.build(prediction_create_params)
  if @awardprediction.mvp_select.present? && @awardprediction.mvp.present?
    flash[:alert] = "Your Award prediction could not be saved. Please make sure to only select valid input."
  elsif @awardprediction.mvp_select.present?
    @awardprediction.mvp = @awardprediction.mvp_select
    @awardprediction.mvp_select = nil
  end
  unless @awardprediction.save 
    flash[:alert] = "Your Award prediction could not be saved. Please make sure to only select valid input."
  end       
    redirect_to :back

end

然后将以下内容添加到我的模型中以验证XOR

validate :mvp_xor_mvp_select
def mvp_xor_mvp_select
        unless mvp.blank? ^ mvp_select.blank?
            errors.add(:base, "Why are you trying to cheat")
        end
end

然后,当然,将选择字段的属性更改为:mvp_select