【问题标题】:Trouble on using ActiveModel in order to implement a "Contact Us" form使用 ActiveModel 实现“联系我们”表单时遇到问题
【发布时间】:2011-08-07 15:41:08
【问题描述】:

我正在使用 Ruby on Rails 3.0.9,并且我正在尝试自己实现“联系我们”表单。所以...

...在我的模型文件中,我有:

require 'active_model'

class ContactUs
  include ActiveModel::Conversion
  include ActiveModel::Validations

  attr_accessor :email, :subject, :message

  def initialize(attributes = {})
    @attributes = attributes
  end

  validates :email,
    :presence   => true

  validates :subject,
    :presence   => true

  validates :message,
    :presence   => true


  def persist
    @persisted = true
  end

  def persisted?
    false
  end
end

...在我的视图文件中,我有:

<%= form_for @contact_us, :url => contact_us_path do |f| %>
  <%= f.text_field :email %>
  <%= f.text_field :subject %>
  <%= f.text_area  :message %>
<% end %>

...在我的路由器文件中:

match 'contact_us' => 'pages#contact_us', :via => [:get, :post]

...在我的控制器文件中,我有:

class PagesController < ApplicationController
  def contact_us
    case request.request_method

    when 'GET'
      @contact_us = ContactUs.new

    when 'POST'
      @contact_us = ContactUs.new(params[:contact_us])
    end
  end
end

使用上面的代码,当我提交带有至少一个空白字段的表单(我这样做是为了使它不通过验证)并且重新加载表单时,我没有自动填充这些字段。也就是说,在重新加载表单后(这发生在按下提交按钮后)字段值将全部设置为空白值。

有什么问题?我在使用ActiveModel 时错了吗?

【问题讨论】:

标签: ruby-on-rails ruby ruby-on-rails-3 forms activemodel


【解决方案1】:

尝试替换

<%= form_for @contact_us, :url => contact_us_path do |f| %>
   <%= f.text_field :email %>
   <%= f.text_field :subject %>
   <%= f.text_area  :message %>
<% end %> 

<%= form_for @contact_us, :url => contact_us_path do |f| %>
   <%= f.text_field :email, :value => @contact_us.email %>
   <%= f.text_field :subject, :value => @contact_us.subject %>
   <%= f.text_area  :message, :value => @contact_us.message %>
<% end %> 

编辑:

我相信您必须自己添加质量分配功能,如下所示:

def initialize(attributes = {})
  attributes.keys.each do |attr|
    self.class.send(:attr_accessor, attr.to_sym)
    instance_variable_set "@" + attr.to_s, attributes[attr.to_sym]
  end
end

您实际上可以跳过这一行:self.class.send(:attr_accessor, attr.to_sym),如果您想像现在一样拥有attr_accessor :email, :subject, :message

【讨论】:

  • 它不起作用。提交表单时似乎没有填写“@contact_us = ContactUs.new(params[:contact_us])”数据。
  • 是的,这些都已经产生了......而且太多了!!!如果我填写所有字段,也会发生这些错误。
  • 我认为问题出在:@contact_us = ContactUs.new(params[:contact_us]) 或附近。如果我调试params[:contact_us],我会得到以下--- !map:ActiveSupport::HashWithIndifferentAccess email: email@test.com subject: Test subject message: Test message
  • 好的,现在它可以工作了。但是有一种“标准”的方式来实现吗?
  • 我不是 100% 确定,但我认为这几乎是 ActiveRecord 在内部所做的,所以我将这种方式称为“标准”。您还可以在初始化方法中显式定义每个属性,例如:@email = attributes[:email] .. 等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2021-07-13
  • 2017-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多