用户如何使用表单来更新另一个模型的表的值?

时间:2019-01-10 02:38:42

标签: ruby-on-rails ruby rails-geocoder

我有一个包含他们地址的用户。现在,我有另一个表,称为搜索地址,其中包含一个search_address。

这应该是一对一的关系,用户只能在搜索地址表上创建一个搜索地址。

我想要它,以便用户可以提交表单,并在地址搜索表中创建search_address。然后,我要回调那个search_address的纬度和经度(我正在使用geocoder gem)。

这是我到目前为止的代码:

模式:

  create_table "users", force: :cascade do |t|
    t.string   "address"
    t.float    "latitude"
    t.float    "longitude"
  end
  create_table "search_addresses", force: :cascade do |t|
    t.datetime "created_at",       null: false
    t.datetime "updated_at",       null: false
    t.string   "search_address"
    t.float    "search_latitude"
    t.float    "search_longitude"
  end

用户模型:

class User < ActiveRecord::Base

geocoded_by :address
after_validation :geocode

end

搜索地址模型:

class SearchAddress < ActiveRecord::Base
  belongs_to :user

  geocoded_by :search_address, :latitude => :search_latitude, :longitude => :search_longitude

end

我当前的视图(我将此答案基于另一个Stack答案,但它不起作用):

<%= semantic_form_for @users do |f| %>

<%= fields_for @user.searchaddresses do |g| %>

    <div class="field">
      <%= g.label :search_address, 'Search Address' %>
      <br/>
      <%= g.text_field :search_address, :class => "form-control" %>
    </div>

  <%= f.submit 'Save Search Address' %>
  <% end %>
  <% end %>

此外,我想要的视图将显示如下内容:

<%= @user.searchaddress.latitude %>
<%= @user.searchaddress.longitude %>

基于此信息,我应该对表单做些什么,以便用户可以添加一个搜索地址,然后让另一个视图显示该搜索地址的纬度和经度?

1 个答案:

答案 0 :(得分:0)

1 =>为用户使用Nested Attributes

class User < ActiveRecord::Base
  has_many : search_addresses, dependent: :destroy
  geocoded_by :address
  after_validation :geocode
  accepts_nested_attributes_for :search_addresses
end

2 =>修正错字

<%= semantic_form_for @user do |f| %>

  <%= fields_for @user.search_addresses do |g| %>
    <div class="field">
      <%= g.label :search_address, 'Search Address' %>
      <br/>
      <%= g.text_field :search_address, :class => "form-control" %>
    </div>
  <% end %>

  <%= f.submit 'Save Search Address' %>
<% end %>

3 => users_controller.rb

def update
  #fetch user to be updated along with search_addresses
  @user.update(update_user_params)
  #after update
end

private
  def update_user_params
    params.require(:user).permit(search_addresses_attributes: [:search_address])
  end

参考:-Ruby on Rails Nested Attributes

Active Record Nested Attributes