我是Rails的新手。
我有一个模型关联(belongs_to - > has_many),但应用程序不会在外键列中保存关联模型的ID。
迁移文件:
class CreatePartnerAdvertisements < ActiveRecord::Migration
def change
create_table :partner_advertisements do |t|
t.belongs_to :user, index: true
t.belongs_to :county, index: true
t.text :description, null: true
t.string :city, null: true, limit: 100
t.integer :age, null: false, limit: 120
t.integer :height, null: true, limit: 300
t.integer :weight, null: true, limit: 300
t.timestamps null: false
t.timestamps null: false
end
end
end
保存后外键的列总是1的模型
class PartnerAdvertisement < ActiveRecord::Base
belongs_to :user, autosave: true
belongs_to :county, autosave: true
validates_associated :county
end
这是视图
<%= form_for(@partner_advertisement) do |f| %>
<div class="field">
<%= f.label :county %><br />
<%= collection_select :partner_advertisement ,:county_id, County.all, :id, :name, {selected: @partner_advertisement.county_id} %>
</div>
<% end %>
所以在这里,我从列表中选择一个县,但是当parter_advertisement保存时,county_id没有被修改...与user_id相同...
所以在Rails中看来,关联保存不起作用。当然,如果在控制器中我从请求中获得了正确的参数,我可以手动保存外键ID。
但对我而言,如果ActiveRecord可以自动保存partner_advertisement的外键,那就太棒了。
控制器:
class PartnerAdvertisementsController < ApplicationController
before_action :authenticate_user!
before_action :set_partner_advertisement, only: [:show, :edit, :update, :destroy]
# GET /partner_advertisements
# GET /partner_advertisements.json
def index
@partner_advertisements = PartnerAdvertisement.where(is_active: true)
end
# GET /partner_advertisements/1
# GET /partner_advertisements/1.json
def show
end
# GET /partner_advertisements/new
def new
@partner_advertisement = PartnerAdvertisement.new
end
# GET /partner_advertisements/1/edit
def edit
end
# POST /partner_advertisements
# POST /partner_advertisements.json
def create
@partner_advertisement = PartnerAdvertisement.new(partner_advertisement_params)
#@partner_advertisement.user_id = current_user.id
respond_to do |format|
if @partner_advertisement.save
format.html { redirect_to @partner_advertisement, notice: 'Partner advertisement was successfully created.' }
format.json { render :show, status: :created, location: @partner_advertisement }
else
format.html { render :new }
format.json { render json: @partner_advertisement.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /partner_advertisements/1
# PATCH/PUT /partner_advertisements/1.json
def update
respond_to do |format|
if @partner_advertisement.update(partner_advertisement_params)
format.html { redirect_to @partner_advertisement, notice: 'Partner advertisement was successfully updated.' }
format.json { render :show, status: :ok, location: @partner_advertisement }
else
format.html { render :edit }
format.json { render json: @partner_advertisement.errors, status: :unprocessable_entity }
end
end
end
# DELETE /partner_advertisements/1
# DELETE /partner_advertisements/1.json
def destroy
@partner_advertisement.destroy
respond_to do |format|
format.html { redirect_to partner_advertisements_url, notice: 'Partner advertisement was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_partner_advertisement
@partner_advertisement = PartnerAdvertisement.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def partner_advertisement_params
#params[:partner_advertisement]
params.require(:partner_advertisement).permit(:age, :height, :weight, :city, :county, :description, :style, :club, :level, :goal, :weekly, :occasionally, :years, :is_active)
end
end
更新请求的日志没有任何错误:
Started PATCH "/partner_advertisements/1" for 10.0.2.2 at 2015-10-11 20:01:06 +0000
Cannot render console from 10.0.2.2! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by PartnerAdvertisementsController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"dVNIi2H59EuZFrlrE+1ujRzDauJdc4Kkox6TbWNzpGK1mOoyfk6U8s9B/+HzASofd7DLe8/kdn4UKKIPCepjog==", "partner_advertisement"=>{"description"=>"yeap yeapr", "city"=>"Eger", "county_id"=>"9", "age"=>"45", "height"=>"43", "weight"=>"435", "style"=>"asdfdsafdf", "club"=>"adsfdf", "level"=>"asdfdsf", "goal"=>"sdfdsf", "weekly"=>"4", "occasionally"=>"3", "years"=>"3", "is_active"=>"1"}, "commit"=>"Update Partner advertisement", "id"=>"1"}
[1m[35mUser Load (1.6ms)[0m SELECT "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
[1m[36mPartnerAdvertisement Load (1.6ms)[0m [1mSELECT "partner_advertisements".* FROM "partner_advertisements" WHERE "partner_advertisements"."id" = ? LIMIT 1[0m [["id", 1]]
Unpermitted parameter: county_id
[1m[35m (0.1ms)[0m begin transaction
[1m[36m (0.2ms)[0m [1mcommit transaction[0m
Redirected to http://localhost:3000/partner_advertisements/1
Completed 302 Found in 15ms (ActiveRecord: 3.6ms)
所以你可以在请求中看到county_id是9,但是在保存后数据库中总是1 ... :(
答案 0 :(得分:0)
您需要允许county_id
中的partner_advertisement_params
。
只需将其添加为:
def partner_advertisement_params
#params[:partner_advertisement]
params.require(:partner_advertisement).permit(:age, :height, :weight, :city, :county, :description, :style, :club, :level, :goal, :weekly, :occasionally, :years, :is_active, :county_id)
end