2015-03-11 3 views
1

У меня есть простая связь между двумя моделями. «Листинги» могут иметь много «предложений», а предложения могут иметь только один листинг. Я могу создавать списки просто отлично, но когда я создаю связанное «Предложение», детали из моей формы заявки не сохраняются в базе данных. Сам объект сохраняет и включает в себя идентификатор листинга, связанный с ним, но ничего из формы не происходит.Рельсы не сохраняют информацию об объекте по методу создания

Я наклеил наиболее подходящие кодовые блоки, любые советы будут оценены.

Предложение Контроллер: класс OffersController < ApplicationController

def new 
@listing = Listing.find(params[:id]) 
@offer = @listing.offers.build 
end 

def create 
@listing = Listing.find(params[:id]) 
@offer = @listing.offers.create!(params[offer_params]) 
if @offer.save 
    redirect_to offer_path(:id => @offer.id) 
end 
end 

def show 
@offer = Offer.find(params[:id]) 
end 

def index 
end 

private 
def offer_params 
params.require(:offer).permit(:offer_price, :offer_terms, :listing_id,  :offer_expiration) 
end 

end 

формы, связанную с предложениями

<%= @listing.street_address %> (<%= link_to "Back", listings_path %>) 

<%= form_for [@offer, @listing], :url => { :action => :create, :id => @listing.id}, html: {multipart: true} do |f| %> 
<div class="field"> 
<%= f.label :offer_price %><br> 
<%= f.text_field :offer_price %> 
</div> 
<div class="field"> 
<%= f.label :offer_terms %><br> 
<%= f.text_area :offer_terms %> 
</div> 
<div class="field"> 
<%= f.label :offer_expiration %><br> 
<%= f.text_field :offer_expiration %> 
<div class="actions"> 
<%= f.submit %> 
</div> 
<% end %> 

И, наконец, запись в журнале развития, когда я нажимаю отправить на моей форме. Как вы можете видеть, он правильно хранит данные о предложениях (я думаю) в хеше params, но когда он вставляет его в базу данных, все поля предложений не идут.

Started POST "/offers?id=2" for ::1 at 2015-03-11 13:40:01 -0400 
Processing by OffersController#create as HTML 
Parameters: {"utf8"=>"✓","authenticity_token"=>"NldTPDo/s/Jyo8SB0I6/OWYWeN0Ukf9JYQU5nASUDONcMl OQTauG+HWxsfjZ4yJLrvDxVtbUaX2sBD63BMIQtA==", "offer"=>{"offer_price"=>"988888", "offer_terms"=>"financed", "offer_expiration"=>"Never"}, "commit"=>"Create Offer", "id"=>"2"} 

[1m[35mListing Load (0.2ms)[0m SELECT "listings".* FROM "listings" WHERE "listings"."id" = ? LIMIT 1 [["id", 2]] 


[1m [36m (0,1 мс) [0m [1mbegin сделка [0m
[1m [35mSQL (0.4ms) [0м INSERT INTO "предложения" ("listing_id", "created_at" , "updated_at") VALUES (?,?,?) [["listing_id", 2], ["created_at", "2015-03-11 17: 40: 01.967717"], ["updated_at", "2015-03 -11 17: 40: 01,967717" ]]

[1m[36m (0.8ms)[0m [1mcommit transaction[0m 

[1m[35m (0.1ms)[0m begin transaction 

[1m[36m (0.0ms)[0m [1mcommit transaction[0m 
Redirected to http://localhost:3000/offers/33 
Completed 302 Found in 36ms (ActiveRecord: 2.6ms) 

ответ

0

В вашем def create заменить params[offer_params] только с offer_params.

def create 
    @listing = Listing.find(params[:id]) 
    @offer = @listing.offers.build(offer_params) # <- the important change 
    if @offer.save 
    redirect_to offer_path(:id => @offer.id) 
    else 
    flash[:error] = @offer.errors.full_messages 
    render :new 
    end 
end 

Дополнительная

.create! ->.build

  • Использование .build вместо .create! в вашем создании действия. .create! вызывает .save преждевременно для оператора if, вызывающего двойные запросы к базе данных.
  • Кроме того, .create! не позволяет ошибкам терпеть неудачу; что если проверка на вашем Offer не удастся, ваше приложение будет ломаться.

Рендер: новый, если сохранить не удается

  • Если сохранение модель не Распространено засавить на: новый взгляд, чтобы предотвратить недостающую: Ошибка создания шаблона, чтобы отобразить ошибки сохранения (т.е. - " Ваше предложение должно содержать цену ») и дать пользователю возможность исправить их запрос.
+1

Awesome. Это сработало отлично. Спасибо огромное! –