我有一个地址栏,但我没有使用:我的表格中的地址,而是我有
: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
答案 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) %>