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 に答える