2014-09-23 2 views
0

У меня проблема с формой с вложенным ресурсом. Модель данных легко:Форма с вложенным ресурсом: не поддерживает связь

class Event < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :name, use: [:slugged, :finders] 
    has_many :event_contents 
end 

class EventContent < ActiveRecord::Base 
    belongs_to :event 
end 

Моя форма:

= simple_form_for([:admin, @event, @event.event_contents.new], remote: true) do |f| 
    .chat-form 
    .input-cont 
     = f.input :content, label: false, input_html: { class: 'form-control' }  
    .btn-cont 
     %span.arrow 
     = f.submit 'invia', class: 'btn blue icn-only' 

Контроллер:

class Admin::EventContentsController < AdminController 
    def create 
    @event_content = EventContent.new event_content_params 
    @event_content.user_id = current_user.id if current_user 
    if @event_content.save 
     respond_to do |format| 
     format.js { render :nothing => true } 
     end 
    else 

    end 
    end 

    private 
    def event_content_params 
    params.require(:event_content).permit(
     :content, 
     :event_id, 
     :user_id 
    ) 
    end 
end 

Когда я отправить почту в Params вместо event_id У меня есть событие «тихоход "

pry(#<Admin::EventContentsController>)> params 
=> {"utf8"=>"✓", "event_content"=>{"content"=>"uhm"}, "commit"=>"invia", "action"=>"create", "controller"=>"admin/event_contents", "event_id"=>"test-test-test"} 

Запись является созданный в db, но event_id равен нулю, поэтому связь нарушена. Почему вместо event_id у меня есть событие slug ???

Update

Вопрос был контроллер:

def create 
    @event = Event.find params[:event_id] 
    @event_content = @event.event_contents.build event_content_params 
    @event_content.user_id = current_user.id if current_user 
    if @event_content.save 
     respond_to do |format| 
     format.js 
     end 
    else 

    end 
    end 

ответ

0

Может попробовать делать следующее:

  1. в модели Event добавить accepts_nested_attributes_for :event_contents
  2. в вашей форме, когда вы собираете: event_contents замените

    f.input :content, label: false, input_html: { class: 'form-control' } 
    

    со следующим:

    f.fields_for :event_contents do |content| 
    content.input :content 
    end 
    
  3. обновления вашего сильным Params в вашем Событии контроллера включить {: event_contents_attributes}, которая может выглядеть, как показано ниже в зависимости от другого Params вам необходимо пройти через:

    params.require(:event).permit(:name, {:event_contents_attributes => [:content]}) 
    
  4. В контроллере событий обновите def new включить этот пункт строки event_content = @event.event_contents.build

Все, что сказать, я полагаю, вы хотели бы, чтобы это быть направлены к контроллеру событий и не контроллер EventContents, потому что: event_contents вложены в: события. Похоже, ваша форма теперь отправляется на контроллер EventContents. Кроме того, я не считаю, что этот аргумент в вашем simple_form_for @event.event_contents.new необходим.

Вот что я построил на вашем вопрос. Это не имя администратора, но может быть полезно.

class EventsController < ApplicationController 


def new 
    @event = Event.new 
    event_content = @event.event_contents.build 
    end 

def create 
    @event = Event.new(event_params) 
    respond_to do |format| 
     if @event.save 
      format.html { redirect_to @event, notice: 'Event was successfully created.' } 
      format.json { render :show, status: :created, location: @event } 
      format.js 
     else 
      format.html { render :new } 
      format.json { render json: @event.errors, status: :unprocessable_entity } 
     end 
    end 
private 
def event_params 
     params.require(:event).permit(:name, {:event_contents_attributes => [:content]}) 
    end 
end 

модель событий:

class Event < ActiveRecord::Base 
    has_many :event_contents 
    accepts_nested_attributes_for :event_contents 
end 

И, наконец, форма:

<%= form_for(@event) do |event| %> 

    <div class="field"> 
    <%= event.label :name %><br> 
    <%= event.text_field :name %> 
    </div> 

    <%= event.fields_for :event_contents do |content| %> 
     <div class="field"> 
     <%= content.label :content %> 
     <%= content.text_field :content %> 
    </div> 
    <% end %> 

    <div class="actions"> 
    <%= event.submit %> 
    </div> 
<% end %> 
+0

Найдено вопрос ... –

Смежные вопросы