0

제가 작업하고있는 레일즈 4 프로젝트에 대한 코드가 있습니다. active_record (mysql2)를 사용하며, rails c (프로덕션 또는 개발 환경)을 통해 상호 작용할 때 제대로 작동하는 has_many :through 관계가 있습니다. 내가 simple_form을 사용하고있는 형태로 관계를 제출하려고하면 저장하지 못하는 것 같습니다. 여기레일 4가 컨트롤러에서 작동하지 않습니다.

는 (정말 전체 소스를 표시 할 수 없습니다 단지 조각을 표시) 내 정보가 현재 설정 방법은 다음과 같습니다

모델 :

has_many :categorizations 
has_many :resource_categories, through: :categorizations 

accepts_nested_attributes_for :resource_categories 
accepts_nested_attributes_for :categorizations 

형태 :

= simple_form_for @resource do |f| 
    = f.association :resource_categories 

컨트롤러 :

# POST /resources 
# POST /resources.json 
def create 
    @resource = Resource.new(resource_params) 
    set_categories(@resource, params[:resource][:resource_category_ids]) 

    respond_to do |format| 
    if @resource.save 
     format.html { 
     redirect_to @resource, notice: 'Resource was successfully created.' 
     } 
     format.json { 
     render action: 'show', status: :created, location: @resource 
     } 
    else 
     format.html { 
     render action: 'new' 
     } 
     format.json { 
     render json: @resource.errors, status: :unprocessable_entity 
     } 
    end 
    end 
end 

# PATCH/PUT /resources/1 
# PATCH/PUT /resources/1.json 
def update 
    respond_to do |format| 
    if @resource.update(resource_params) 
     set_categories(@resource, params[:resource][:resource_category_ids]) 
     format.html { 
     redirect_to @resource, notice: 'Resource was successfully updated.' 
     } 
     format.json { 
     head :no_content 
     } 
    else 
     format.html { 
     render action: 'edit' 
     } 
     format.json { 
     render json: @resource.errors, status: :unprocessable_entity 
     } 
    end 
    end 
end 

# Never trust parameters from the scary internet, only allow the white list 
# through. 
def resource_params 
    params.require(:resource).permit(
    :title, :slug, :ancestry, :status, :author_id, :published, :parent_id, 
    :resource_category_ids, :preview, :body 
) 
end 

def set_categories(resource, categories) 

    # Clean out the existing categories (if there are any) 
    unless resource.resource_categories.blank? 
    resource.resource_categories.each do |category| 
     resource.resource_categories.delete(category) 
    end 
    end 

    unless categories.blank? 
    categories.each do |category| 
     unless category.blank? 
     resource.resource_categories << ResourceCategory.find(category) 
     end 
    end 
    end 
end 
그것은 내 문제처럼 보인다
Resource.all.each do |resource| 
    ResourceCategory.all.each do |category| 
    resource.resource_categories << category 
    end 
end 

은 컨트롤러가 호출되지 않는 것입니다 : 나는 rails c -e production (또는 그냥 일반 rails c)를 사용하여 다음 명령 작동 실행하면(이 예에서는, 나는 모든 자원에 대한 모든 범주를 할당) 도우미 기능이 대신

답변

1

사용 :

def create 
    @resource = Resource.new(resource_params)  
    @resource.set_categories(params[:resource][:resource_category_ids]) 
    .. 
end 

이동합니다 Resource 모델의 방법

def set_categories(categories) 

    # Clean out the existing categories (if there are any) 
    unless new_record? 
    unless resource_categories.blank? 
     resource_categories.each do |category| 
     resource_categories.delete(category) 
     end 
    end 
    end 

    unless categories.blank? 
    categories.each do |category| 
     unless category.blank? 
     resource_categories << ResourceCategory.find(category) 
     end 
    end 
    end 
end 

@resource은 컨트롤러의 인스턴스 변수이므로 메서드에 전달할 필요가 없습니다. 모든 작업을 인스턴스 변수에서 직접 수행하십시오.

영업 이익은 여전히 ​​기록을 저장하는 동안, 문제가 있었다 resource_params 방법 :resource_category_ids => []:resource_category_ids 변경 : 응답에 대한

def resource_params 
params.require(:resource).permit( 
:title, :slug, :ancestry, :status, :author_id, :published, :parent_id, 
:preview, :body, :resource_category_ids => [] 
) 
end 
+0

감사합니다! 그럴 것이라고 생각했지만 불행히도 문제를 해결하지 못합니다. 무슨 일이 벌어지고 있는지는 카테고리를 지우는 비트가 실행 중입니다 (콘솔에서 일부를 채우고 편집 양식을 실행했는데 관계가 예상대로 지워졌습니다).하지만 '@ resource.resource_categories'가 채워지지 않습니다. 새로운 것들과의 관계. 그것을 축소 시키지만, 왜 아직도 작동하지 않는지 혼란 스럽습니다. –

+0

채팅으로 토론 해 보겠습니다. http://chat.stackoverflow.com/rooms/48530/ror –

+0

올바른 것으로 표시하십시오. Kirti Thorat와 함께 저를 고수해 주셔서 감사합니다! –