Rails 4.2:日志中的未知属性或服务器错误

Rails 4.2: Unknown Attribute or Server Error in Log

我有一个带有 select_tagoptions_from_collection_for_select 的表格,我似乎无法通过。在视图中,当上传 ID 设置为 uploadzip_id 时,我得到一个 302 重定向,当它设置为 uploadzip_ids 时,我得到一个 Unknown Attribute 错误。

我有点困惑,因为我的关系是和外键一起设置的。我有另一个带有复选框的模型,名为 Uploadpdf,效果很好。

这是设置..

class Campaign < ActiveRecord::Base
    has_one :uploadzip
end

class Uploadzip < ActiveRecord::Base
    belongs_to :campaign
end

db/schema.rb

  create_table "campaigns", force: :cascade do |t|
    t.string   "name"
    t.text     "comment"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false

  create_table "uploadzips", force: :cascade do |t|
    t.string   "file_name"
    t.string   "file_type"
    t.datetime "date"
    t.integer  "size"
    t.integer  "pages"
    t.string   "file_ident"
    t.string   "md5"
    t.datetime "created_at",  null: false
    t.datetime "updated_at",  null: false
    t.integer  "campaign_id"
  end

  add_foreign_key "uploadzips", "campaigns"

app/controllers/campaign_controller.rb

class CampaignsController < ApplicationController
      def index
        @campaigns = Campaign.all.order("created_at DESC")
      end

      def new
        @campaign = Campaign.new
      end

      def create
        @campaign = Campaign.new(campaign_params)

        if @campaign.save
            flash[:success] = "Campaign Successfully Launched!"
            redirect_to @campaign
        else
            flash[:error] = "There was a problem launching your Campaign."
            redirect_to new_campaign_path
        end
      end

    .....

  private

      def campaign_params
        params.require(:campaign).permit(:name, :comment, :uploadzip_ids, uploadpdf_ids: [])
      end
end

views/campaigns/_form.rb

<%= form_for @campaign, url: {action: "create"} do |f| %>

    .....some typical fields..

    <%= f.label :data_file, class: "right-label" %>

    <%= select_tag campaign[uploadzip_ids], 
                options_from_collection_for_select(
                Uploadzip.all, :id, :file_name
                ), { include_blank: "Include a Zip File" } %>

    .....some more typical fields

<% end %>

更新

我已经按照建议更改了代码以更好地反映外键。现在已成功创建活动,但未与所选 uploadzip Zip 文件相关联。当调用 @campaign.uploadzip 时,它 returns nil

这是更新后的代码:

<%= select_tag "uploadzip[campaign_id]",
    options_from_collection_for_select(
    Uploadzip.all, :id, :file_name
    ), { include_blank: "Include a Zip File" } %>

我也把控制器params.require改成了..

  def campaign_params
    params.require(:campaign).permit(:name, :comment, :campaign_id, uploadpdf_ids: [])
  end

根据您的协会设置,foreign_key 应该是 campaign_id 而不是 uploadzip_id。您应该根据您的用例更改 associationsforeign_key

我还建议您关注这些 Guides 以了解更多关于协会的信息。

302 重定向可能不是坏事,因为您正在执行 redirect_to new_campaign_path。当您在视图和控制器 params.permit 部分中使用 uploadzip_id 时,记录是否正确创建?

FaceBook 小组的成员通过添加一点帮助我解决了这个问题 控制器中的额外逻辑..

  if @campaign.save

    zip = Uploadzip.find(params[:uploadzip_id])
    zip.campaign = @campaign
    zip.save

    flash[:success] = "Campaign Successfully Launched!"
    redirect_to @campaign
  else
    flash[:error] = "There was a problem launching your Campaign."
    redirect_to new_campaign_path
  end

..遇到了更改 select_tag 的名称。

  <%= select_tag :uploadzip_id,
      options_from_collection_for_select(
      Uploadzip.all, :id, :file_name
      ), { include_blank: "Include a Zip File" } %>