1

我是 Rails 新手,正在修复 Rails 2 站点。我有一个表单,它允许用户使用输入或下拉字段添加起始位置 (:start) 的信息。但是,我发现当我包含这两个选项时,只有下拉列表(最后一个)提交数据,而输入被忽略。包含这两个选项的正确方法是什么?

我的观点

    <% form_for @newsavedmap, :html=>{:id=>'createaMap'} do |f| %>
    <%= f.error_messages %>
    <p>Enter a street address, city, and state:
    <%= f.text_field :start, {:id=>"startinput", :size=>50}%></p>
    <p>Or, select a location from the list:
    <%= f.select :start, options_for_select(@itinerary.locations), {:include_blank => true }, {:id=>"startdrop"} %>      

    <input type="submit" id="savethismap" value="Save Map">
    <% end %>
4

1 回答 1

2

实现此目的的一种方法是使用虚拟属性。由于两个字段都映射到相同的属性,因此您必须选择使用哪一个。

# app/models/newsavedmap.rb
class Newsavedmap < ActiveRecord::Base
  ...
  attr_accessible :start_text, :start_select
  ...

  def start_text=(value)
    @start_text = value if value
    prepare_start
  end

  def start_select=(value)
    @start_select = value if value
    prepare_start
  end

  # start_text will fall back to self.start if @start_text is not set
  def start_text
    @start_text || self.start
  end

  # start_select will fall back to self.start if @start_select is not set
  def start_select
    @start_select || self.start
  end

private 
  def prepare_start
    # Pick one of the following or use however you see fit.
    self.start = start_text if start_text
    self.start = start_select if start_select
  end
end

那么你的表单需要使用虚拟属性:

<%= f.text_field :start_text, {:id=>"startinput", :size=>50}%></p>
<p>Or, select a location from the list:
<%= f.select :start_select, options_for_select(@itinerary.locations), {:include_blank => true }, {:id=>"startdrop"} %>

其他选项包括:

  1. 如果用户选择一个选项,则使用 text_field 作为主要选项并使用所选选项更新它的值。
  2. 在表单中添加隐藏字段,并在 text_field 文本更新或选择选项更改时使用 JavaScript 更新隐藏字段的值
于 2013-09-03T01:21:25.430 回答