【问题标题】:Rails 4 function in controller not running控制器中的 Rails 4 功能未运行
【发布时间】:2014-03-28 15:24:22
【问题描述】:

我有一些我正在处理的 Rails 4 项目的代码。它使用 active_record (mysql2),当我通过rails c(在生产或开发中)交互时,has_many :through 关系可以正常工作。当我尝试在表单中提交关系时(我使用的是 simple_form),我似乎无法保存它。

这是我目前的信息设置方式(仅显示 sn-ps,我无法真正显示整个源):

型号:

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

当我使用rails c -e production(或简单的rails c)发出以下命令时,它可以工作(在本例中,我将所有类别分配给所有资源):

Resource.all.each do |resource|
  ResourceCategory.all.each do |category|
    resource.resource_categories << category
  end
end

看来我的问题是控制器没有调用辅助函数

【问题讨论】:

    标签: activerecord ruby-on-rails-4 controller simple-form has-many-through


    【解决方案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 是控制器的实例变量,您不需要将其传递给方法。直接对实例变量执行所有操作。

    OP在保存记录时仍然有问题,在resource_params方法中将:resource_category_ids更改为:resource_category_ids =&gt; []

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

    【讨论】:

    • 感谢您的回复!我认为这样做可以,但不幸的是它并没有解决问题。看起来正在发生的事情是清除类别的位正在运行(我在控制台中填充了一些并运行了编辑表单;该关系按预期清除了),但它没有填充 @resource.resource_categories 与新的。缩小了一些范围,但我仍然对它为什么不起作用感到困惑。
    • 标记为正确。感谢您一直关注我 Kirti Thorat!
    • 不用担心迈兰。很高兴帮助:)
    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-25
    • 2013-11-05
    • 2015-06-25
    • 2016-09-01
    • 2011-02-18
    • 1970-01-01
    相关资源
    最近更新 更多