如何为特色对象预填充_form?

Ant*_*com 7 ruby forms attributes ruby-on-rails object

用户可以输入自定义:action或选择要素:action:

<%= f.text_field :action %>
  Or choose a featured challenge:
<%= f.collection_radio_buttons :action, [['Run a Mile','Run a Mile'], ['Drink 16oz of Water','Drink 16oz of Water'], ['Take a Picture','Take a Picture'], ['1 Drink Max','1 Drink Max'], ['See Eiffel Tower','See Eiffel Tower'], ['Write a Book','Write a Book'], ['Skydive','Skydive'], ['Start a Business','Start a Business'], ['No Snooze','No Snooze'], ['Visit All 50 States','Visit All 50 States'], ['Talk to a Stranger','Talk to a Stranger'], ['Try a New Recipe','Try a New Recipe'], ['Media-fast','Media-fast']], :first, :last %>
Run Code Online (Sandbox Code Playgroud)

如果用户选择了特色,:action那么新挑战/ _form会预先填充他所选择的:action,但现在我想在你的帮助下将其提升到一个新的水平!

<%= form_for(@challenge)  do |f| %>
  Challenge: <%= f.text_field :action %>
  Do On: <%= f.collection_check_boxes :committed %>
  Do For: <%= f.number_field :days_challenged %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

如何预先填充特色挑战的其他属性,例如"Do For"或"Do On"?

例如,如果用户选择了功能:action:'Run a Mile然后我会预填充表单Run a Mile,Mon, Wed, Fri,30 Days.

Pet*_*rov 2

您可以simple_form与 一起使用reform。Reform 将为您提供表单对象,您可以在其中重写填充表单的方法。

这是一个淡化的示例(您必须根据您的情况进行调整):

class ChallengeForm < Reform::Form
  property :action
  property :committed
  property :days_challenged

  model :challenge

  def commited
    super || action_to_commited_hash[model.action]
  end

  def days_challenged
    super || action_to_days_challenged_hash[model.action]
  end

  def action_to_days_challenged_hash
    {
      'Run a Mile' => 30,
      'Take a Picture' => 12
    }
  end

  def action_to_commited_hash
    {
      'Run a Mile' => ['Mon', 'Wed', 'Fri'],
      'Take a Picture' => ['Tu', 'Thu']
    }
  end
end
Run Code Online (Sandbox Code Playgroud)

super上面的方法中将委托给model. 请注意,您正在重写getter方法,并且它不会产生影响setters(如果您想在编写表单数据之前更改表单数据,您也可以重写设置器)。

在你的模板中,而不是

form_for @challenge
Run Code Online (Sandbox Code Playgroud)

你将会拥有:

simple_form_for @form
Run Code Online (Sandbox Code Playgroud)

这是一个超级通用的 Rails 表单库,我无法想象自己不使用它!