我遇到了同样的问题,这是我的解决方案(基于 fl00r 答案的改进):
按照fl00r所说的去做。
在类描述中添加optional: true
class Engine belongs_to :car, optional: true end
更多信息请访问:http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html
- 修改
<%= f.fields_for :engine do |b| %>
<%= b.collection_select :id, Engine.all, :id, :name %>
...
<% end %>
到
<%= f.fields_for :engine, :include_id => false do |b| %>
<%= b.collection_select :id, Engine.all, :id, :name %>
...
<% end %>
更多信息请访问:Stop rails from generating hidden field for fields_for method
- 修改引擎控制器
3.1。修改
def car_params
params.require(:car).permit(:name)
end
到
def car_params
params.require(:car).permit(:name, engine_attributes: [:id, :name])
end
更多信息请访问:Rails 4 Nested Attributes Unpermitted Parameters
3.1。添加函数(私有)
def set_engine
engine_id = car_params[:engine_attributes][:id]
@engine = Engine.find(engine_id)
@car.engine = @engine
@car.save
end
3.2。修改EngineController#update
def update
respond_to do |format|
if @car.update(car_params)
format.html { redirect_to @car, notice: 'Car was successfully updated.' }
format.json { render :show, status: :ok, location: @car }
else
format.html { render :edit }
format.json { render json: @car.errors, status: :unprocessable_entity }
end
end
end
到
def update
respond_to do |format|
if set_engine && @car.update(car_params)
format.html { redirect_to @car, notice: 'Car was successfully updated.' }
format.json { render :show, status: :ok, location: @car }
else
format.html { render :edit }
format.json { render json: @car.errors, status: :unprocessable_entity }
end
end
end