Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何格式化Rails编辑字段中显示的值?_Ruby On Rails_Ruby_Forms - Fatal编程技术网

Ruby on rails 如何格式化Rails编辑字段中显示的值?

Ruby on rails 如何格式化Rails编辑字段中显示的值?,ruby-on-rails,ruby,forms,Ruby On Rails,Ruby,Forms,我想使编辑表单字段尽可能方便用户。例如,对于数值,我希望字段用逗号显示(如number\u和\u precision) 这在显示端很容易,但是编辑呢?有什么好办法吗 我正在使用Rails FormBuilder。经过调查,我发现它使用InstanceTag,它通过在输入前使用\u value\u来获取字段的值,这意味着不会调用重写。到目前为止,我想到的最好的方法是这样的: <%= f.text_field :my_attribute, :value => number_with_pr

我想使编辑表单字段尽可能方便用户。例如,对于数值,我希望字段用逗号显示(如
number\u和\u precision

这在显示端很容易,但是编辑呢?有什么好办法吗


我正在使用Rails FormBuilder。经过调查,我发现它使用InstanceTag,它通过在输入前使用
\u value\u来获取字段的值,这意味着不会调用重写

到目前为止,我想到的最好的方法是这样的:

<%= f.text_field :my_attribute, :value => number_with_precision(f.object.my_attribute) %>
def my_attribute
  ApplicationController.helpers.number_with_precision(read_attribute(:my_attribute))
end
<%= form_for( @section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %> 
   <%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small'  %>
<% end %>
但是您仍然必须使用
:value

<%= f.text_field :my_attribute, :value => f.object.my_attribute %>
f.object.my_属性%>

这似乎需要做很多工作。

我更喜欢您的第一个答案,在视图中完成格式设置。但是,如果您想在模型中执行格式化,可以对getter和setter使用包装器方法,并避免完全使用:value选项

你最终会得到这样的结果

def my_attribute_string
  foo_formatter(myattribute)
end

def my_attribute_string=(s)
  # Parse "s" or do whatever you need to with it, then set your real attribute.
end

<%= f.text_field :my_attribute_string %>
def my_属性_字符串
foo_格式化程序(myattribute)
结束
def my_属性_字符串=(s)
#解析“s”或使用它执行任何需要的操作,然后设置真正的属性。
结束

Railscasts在中的文本字段中用时间对象覆盖了这一点。其中最聪明的部分是他们如何处理验证错误。这一集值得一看。

如果你想在编辑过程中创建或维护一种格式,你需要添加Javascript来实现“掩码”


这是第一次成功。我也做过类似的事情。我们使用自定义表单生成器格式化时间和长度。它使用现有的文本_字段,但对其进行包装,以便可以自定义值:

class SuperFormBuilder < ActionView::Helpers::FormBuilder
  include ApplicationHelper
  include FormHelper
  include ActionView::Helpers::TagHelper
  include ActionView::Helpers::FormTagHelper

  def length_field(label,*args)
    scale = 'medium'
    args.each do |v|
      if v.has_key?(:scale)
        scale = v[:scale]
        v.delete(:scale)
      end
    end
  value = length_conversion(@object.send(label.to_sym),scale)
  options = (args.length > 0) ? args.pop : {}
  return has_error(label, text_field_tag(field_name(label),value,*args) + ' ' +  length_unit(scale))
end

private
def field_name(label)
  return @object_name + "[#{label}]"
end

def has_error(label, output)
  return    "<div class='fieldWithErrors'>#{output}</div>" if @object.errors[label]
  return output
end
class SuperFormBuilder0)?args.pop:{}
返回有错误(标签、文本、字段、标记(字段、名称(标签)、值、*args)+''+长度、单位(刻度))
结束
私有的
def字段名称(标签)
返回@object_name+“[#{label}”
结束
def有错误(标签、输出)
如果@object.errors[label]返回“#{output}”
返回输出
结束
它是这样使用的:

<%= f.text_field :my_attribute, :value => number_with_precision(f.object.my_attribute) %>
def my_attribute
  ApplicationController.helpers.number_with_precision(read_attribute(:my_attribute))
end
<%= form_for( @section, {:action => 'save', :id => @section.id}, :builder => SuperFormBuilder) do |sf| %> 
   <%= sf.length_field :feed_size_min_w, :size => 3, :scale => 'small'  %>
<% end %>
'save',:id=>@section.id},:builder=>SuperFormBuilder)do | sf |%>
3,:比例=>'小'%>
最终结果是根据他们选择的系统(公制、英制)和比例(即小=英寸或毫米)以适当单位表示的值

我基本上是从现有的表单生成器复制了text\u field方法,表单生成器本身使用text\u field\u标记

有两个问题:1)知道对象字段的名称以及如何访问对象以获取要格式化的值。2) 获取正确的名称,以便在提交表单时它是正确的params散列的一部分

表单生成器被赋予一个类变量@object。可以使用.send方法获取字段的值。在我的例子中,我将标签:feed_size_min_w发送到@object并返回其长度。然后将其转换为所需格式,并将其交给text\u field\u标记

字段的名称是使其在params散列中结束的关键,在我的实例中是params[:sections]一。我制作了一个名为field_name的小助手函数来处理这个问题

最后,如果标签上有错误,has_错误会将该字段包装在error div中。

您可以使用该插件。通过为模型中的现有数值属性指定
number\u格式
,该属性现在将在所有表单和视图中显示为已格式化为Rails格式。在插入数据库之前,它还将从该格式(通过表单分配时)解析回来。(该插件还创建了纯数值
无格式的
访问器,可继续用于算术,或用于直接数值赋值或检索,以实现无缝集成。)

classmymodel2,
:分隔符=>,
:strip_training_zeros=>false
def增量单位余额
无格式_余额+=10
结束

您还可以将上述内容与Javascript解决方案相结合,这可以强制用户在编辑时保留小数点和数千个分隔符,尽管这确实不是必需的。

这是一个老问题,但如果有人遇到此问题,您可以使用数字\u to \u X帮助器。它们具有显示编辑值所需的所有属性:

<%= f.text_field :my_number, :value => number_to_human(f.object.my_number, :separator => '', :unit => '', :delimiter => '', :precision => 0) %>
number\u to\u human(f.object.my\u number,:分隔符=>'',:单位=>'',:分隔符=>'',:精度=>0)%>

还有更多的属性可用:

我已经开始悬赏这个问题,因为我想知道是否有一个比JDL和我自己提出的更好的答案。快看!注意:如果第一种解决方案的格式中添加了逗号或货币符号,则需要在控制器的创建和更新方法中删除它们。我会避免使用第二种解决方案,从您的模型中引用
ApplicationController
绝对不是一件好事情。最后一个对我来说最有效,我的函数可能仍然在我的数据模型中,它不会影响提交或编辑。很好的解决方案!不再有演示,这里有一个新的: