2

我有一个地址列,但我没有在我的表单中使用 :address,而是我有

:street, :state, :city, :zip列:

<%= form_for @user, :html => {:multipart => true} do |f| %>
    <%= f.label :street %>
    <%= f.text_field :street %>

    <%= f.label :state %>
    <%= f.text_field :state %>

    <%= f.label :city %>
    <%= f.text_field :city %>

    <%= f.label :zip %>
    <%= f.text_field :zip %>

    <%= f.submit %>
<% end %>

因为我没有 :address 的字段,但我想编译表单中的信息并将其插入到我的数据库中。例如

12345 Maple St, Made City CA 90017或者当我变得更高级时,我会使用一些 gem 来编译给定的信息并放入正确的地址格式。)

我该怎么做这样的事情?

我的控制器看起来像这样:

  def create
    @user = User.new(params[:user])
    if @user.save
        redirect_to @user, notice: "Successfully created."
    else
      render :action => 'edit'
    end
  end
4

3 回答 3

2
    def create
            address = [params[:user].delete(:street), params[:user].delete(:state), params[:user].delete(:city), params[:user].delete(:zip)].join(", ")
            @user = User.new(params[:user].merge(:address => address))
            if @user.save
                redirect_to @user, notice: "Successfully created."
            else
              render :action => 'edit'
            end
        end
于 2013-06-06T04:29:17.767 回答
1

除非处理开销是一个主要问题,否则您通过将连接的模型属性保存为单独的属性来打破 Rails 的DRY原则。

Rails实现这一点的方法是创建一个模型便利方法,将现有属性连接到地址属性中,而不需要将任何其他属性提交到数据库:

# my_model.rb
def address
    [street, city, state, zip].join(', ')
end

# my_view.html.erb
<%= @user.address %>

或者,如果您只需要在视图中显示完整地址,您可以考虑使用视图助手:

# app/helpers/my_model_helper.rb
module MyModelHelper
    def formatted_address(address)
        [address.street, address.city, address.state, address.zip].join(', ')
    end
end

# my_view.html.erb
<%= formatted_address(@address) %>
于 2013-06-06T04:50:41.467 回答
1

另一种选择是在模型中进行

attr_accessor :street, :city, :state, :zip

before_create :concate_address_attrs

编辑:-

我觉得 before_save 比 before_create 更好用

before_save :concate_address_attrs

def concat_address_attrs
  self.address = [street, city, state, zip].join(", ")
end
于 2013-06-06T04:32:29.483 回答