Ruby on Rails:根据用户输入将值插入数据库?

时间:2013-06-06 04:23:08

标签: ruby-on-rails ruby

我有一个地址栏,但我没有使用:我的表格中的地址,而是我有

: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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分:1)

除非处理开销是主要问题,否则您将破坏Rails&#39; DRY原则通过将连接的模型属性保存为单独的属性。

完成此操作的 Rails Way 将创建一个模型便捷方法,将现有属性连接到 - 地址属性,而不需要任何其他属性都提交给数据库:

# 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) %>