嵌套资源的表单:不能保持关联

问题描述:

我有一个嵌套资源的表单有问题。数据模型很简单:嵌套资源的表单:不能保持关联

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代替事项标识提交后我有事件“蛞蝓“

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 ???

更新

的问题是控制器:

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 

也许尝试执行以下操作:

    在事件模型
  1. 在表单中添加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通过:

    ​​
  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

发现问题... – 2014-09-24 07:44:01