这是我几天前提出的另一个多态问题的后续。我正在为地址创建多态关联。在这种情况下,我只是想看看它是否可以在一个简单的模型中工作,所以我在我制作的现有测试博客中的“文章”中添加了一个“地址”。我的问题是我现在可以使用新的“文章”创建一个地址(知道文章将是真实应用程序中的企业、用户、客户等),并在我去编辑该业务时看到它。但是,如果我编辑地址,现有地址的 addressable_id 将设置为 nil,并创建一个新地址,留下旧地址并更新新地址的 addressable_id。我无法想象这是正确的行为,尽管也许我是以某种方式对自己做的。
这是代码。
文章模型
class Article < ActiveRecord::Base
has_one :address, as: :addressable
accepts_nested_attributes_for :address
end
地址模型
class Address < ActiveRecord::Base
belongs_to :addressable, polymorphic: true
end
物品控制器
class ArticlesController < ApplicationController
before_action :set_article, only: [:show, :edit, :update, :destroy]
# GET /articles
# GET /articles.json
def index
@articles = Article.all
end
# GET /articles/1
# GET /articles/1.json
def show
end
# GET /articles/new
def new
@article = Article.new
@address = @article.build_address(params[:address])
end
# GET /articles/1/edit
def edit
@address = @article.address ||= @article.build_address(params[:address])
end
# POST /articles
# POST /articles.json
def create
@article = Article.new(article_params)
respond_to do |format|
if @article.save
format.html { redirect_to @article, notice: 'Article was successfully created.' }
format.json { render action: 'show', status: :created, location: @article }
else
format.html { render action: 'new' }
format.json { render json: @article.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /articles/1
# PATCH/PUT /articles/1.json
def update
@address =
respond_to do |format|
if @article.update(article_params)
format.html { redirect_to @article, notice: 'Article was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @article.errors, status: :unprocessable_entity }
end
end
end
# DELETE /articles/1
# DELETE /articles/1.json
def destroy
@article.destroy
respond_to do |format|
format.html { redirect_to articles_url }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_article
@article = Article.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def article_params
params.require(:article).permit(:name, :content, :address_attributes => [:line1, :line2, :city, :state, :zip])
end
end
我的数据库迁移文件
class CreateAddresses < ActiveRecord::Migration
def change
create_table :addresses do |t|
t.string :line1
t.string :line2
t.string :city
t.string :state, limit: 2
t.integer :zip, limit: 5
t.references :addressable, polymorphic: true
t.timestamps
end
add_index :addresses, [:addressable_type, :addressable_id], unique: true
end
end
视图是标准的
<%= f.fields_for :address do |address| %>
Fields n stuff.....
<% end %>
正如我所提到的,一切似乎都在这个级别上工作。我仍然对我最初的问题有疑问,并认为这与在那里嵌套有关,所以我会解决这个问题。我只是想在添加之前确保我知道这是正确的。
当您编辑与“文章”相关的现有地址时——在这种情况下——它应该离开旧地址并创建一个新地址,还是更新现有地址?我缺少一些简单的东西吗?