我们有一个应用程序必须使用运行在.NET上的外部数据库进行身份验证。有一个单独的rails应用程序,作为gem安装,用于处理身份验证。当某人进行身份验证时,他们的信息存储在会话对象中。应用程序本身就是一种讨论论坛。
当我通过attachments控制器创建附件时,所有属性都会正确保存到数据库中。但是,当我在讨论模型中使用nested_attributes_for时,只传递定义的回形针属性created_by属性为空否则,其他一切都一样。
为什么不将此属性添加到数据库中?
讨论模式:

class Discussion < ActiveRecord::Base
  belongs_to :creator, :class_name => "Person", :foreign_key => "created_by"
  belongs_to :updater, :class_name => "Person", :foreign_key => "updated_by"
  belongs_to :discussion_group
  belongs_to :discussion_category
  has_many :discussion_comments, dependent: :destroy
  has_many :discussion_attachments, dependent: :destroy
  accepts_nested_attributes_for :discussion_attachments, allow_destroy: true
  validates :discussion_group_id, on: :create, presence: :true
  validates :subject, :body, presence: :true
  validates :external_id, on: :create, uniqueness: :true
  before_create :add_external_id
  validates_associated :creator, :updater, :discussion_group,      :discussion_comments, :discussion_attachments
  scope :for_discussion_group_ids, ->(ids) {where('discussion_group_id IN (?)', ids)}
  scope :for_ext_id, ->(id) {where(external_id: id).first}

  ....

讨论附件模型:
ALLOWABLE_IMAGES = ["image/gif", "image/jpeg", "image/jpg", "image/png"]
ALLOWABLE_APPLICATIONS = ["application/vnd.oasis.opendocument.text",
"application/vnd.oasis.opendocument.spreadsheet",
"application/vnd.oasis.opendocument.presentation",
"application/vnd.ms-excel",
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"application/vnd.ms-powerpoint",
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/vnd.ms-word", "application/pdf", "text/plain"]

class DiscussionAttachment < ActiveRecord::Base
  belongs_to :discussion
  belongs_to :creator, :class_name => "Person", :foreign_key => "created_by"
  belongs_to :updater, :class_name => "Person", :foreign_key => "created_by"
  has_attached_file :document
  validates_attachment :document, :presence => true,
    :content_type => { :content_type => ALLOWABLE_APPLICATIONS + ALLOWABLE_IMAGES },
    :size => { :in => 0..5.megabytes }
end

讨论控制器:
class DiscussionsController < ApplicationController
  before_action :set_discussion, only: [:show, :destroy]
  before_action :authorized_for_discussion?, only: [:show]
  before_action :authorized_to_start_discussion?, only: [:new, :create]

...

  def new
    @discussion = Discussion.new
    @discussion_group = DiscussionGroup.find(params[:discussion_group_id])
    @categories = DiscussionCategory.show.collect{|category| [category.name, category.id]}
    3.times {@discussion.discussion_attachments.build(created_by: current_user.PersonID)}
  end

  def create
    @discussion = Discussion.new(discussion_params.merge!({discussion_group_id: params[:discussion_group_id]}))
    @discussion.created_by = current_user.PersonID

    respond_to do |format|
      if @discussion.save
        flash[:success] = 'Discussion created successfully.'
        format.html { redirect_to discussion_group_discussion_path(@discussion.discussion_group, @discussion), notice: 'Discussion was successfully created.' }
        format.json { render action: 'show', status: :created, location: @discussion }
        Notify.new_discussion_notification(@discussion).deliver
      else
        flash[:error] = 'Discussion not created.'
        @discussion_group = DiscussionGroup.find(params[:discussion_group_id])
        3.times {@discussion.discussion_attachments.build(created_by: current_user.PersonID)}
        format.html { render action: 'new' }
        format.json { render json: @discussion.errors, status: :unprocessable_entity }
      end
    end
  end

 ...

  private

  ...

    def set_discussion
      @discussion = Discussion.find(params[:id])
    end


    def discussion_params
      params.require(:discussion).permit(:discussion_group_id, :discussion_category_id, :subject, :body, :document, discussion_attachments_attributes: [:id, :document])
    end
end

讨论视图:
=render partial: 'shared/error_messages', locals: {object: @discussion}

%h1 Create Discussion
%h4 #{@discussion_group.name }

.form-box
  =form_for @discussion, url: discussion_group_discussions_path, html: {multipart: true}, method: :post do |f|
    =f.hidden_field :discussion_group_id, value: @discussion_group.id
    .row
      .col-md-8.form-group
        =f.label :subject
        %span.required *
        =f.text_field :subject, class: "form-control", placeholder: 'Enter a subject for your discussion'

      .col-md-4.form-group
        =f.label :discussion_category, 'Discussion Category'
        =f.select :discussion_category_id, DiscussionCategory.show.collect{|category| [category.name, category.id]}, {prompt: true}, {class: 'dropselection form-control'}


    .row
      .col-md-8.form-group
        =f.label :body, "Body"
        %span.required *
        =f.text_area :body, class: "form-control", rows: 10

      .col-md-4.form-group
        %label Upload Files
        = f.fields_for :discussion_attachments, :html => {class: "form-control"} do |builder|
          = builder.file_field :document
          %br

    .form-group.row
      .col-md-12
        =f.submit 'Create', class: "btn btn-default"
        = link_to 'Cancel', discussion_group_path(@discussion_group), class: 'btn btn-default'

    .row
      .col-md-12
        %small
          %span.required *
          Denotes required fields
%br

谢谢你能提供的帮助。

最佳答案

万一有人碰到这样的问题查看rails日志,找出params散列是什么样子的我遇到的问题是,由于构建了多个附件字段,:discussion_attachment s_attachments指向一个散列,该散列的键值是附件数组的索引在我的例子中,有3个字段。
所以,我在讨论控制器中创建了一个私有方法:

def set_attachments_created_by
 attrs = params[:discussion][:discussion_attachments_attributes]
 attrs['0'][:created_by] = current_user.PersonID if attrs['0'].present?
 attrs['1'][:created_by] = current_user.PersonID if attrs['1'].present?
 attrs['2'][:created_by] = current_user.PersonID if attrs['2'].present?
end

然后在create中,在创建讨论之前调用方法:
def create
  set_attachments_created_by if params[:discussion][:discussion_attachments_attributes].present?
  @discussion = Discussion.new(discussion_params)
  @discussion.created_by = current_user.PersonID
  ....

可能有一种更优雅的方法可以做到这一点,但它可以为此目的工作,并允许嵌套的_属性传递到DiscussionAttachments模型记住在强参数声明中添加:created_by。

关于ruby-on-rails - 通过Rails中的nested_attributes传递current_user ID,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29522497/

10-14 15:50
查看更多