【问题标题】:Issue with param not pushing data to database in Rails参数不将数据推送到 Rails 中的数据库的问题
【发布时间】:2017-05-22 20:02:50
【问题描述】:

快速的。我在创建对象时尝试将参数推送到数据库中。如果我像下面的注释代码一样强制使用整数,我就可以工作,但是无论出于何种原因,我都无法将它添加到数据库中,因为我使用了 params[:subscription_id] 方法。我可以在我的服务器中看到参数,但看不到它被插入到证书表中。如果我在控制器中强制使用整数,它将通过,我可以看到订阅 ID 被传入。

这是否与我的关系可能与 has_one 关系有关?

Certificate Controller

    class CertificatesController < ApplicationController
    def new 
        @certificate = Certificate.new
    end

    def create
        @certificate = Certificate.new(certificate_params)
        @certificate.subscription_id = params[:subscription_id]
        #@certificate.subscription_id = 1


        if @certificate.save
            flash[:success] = "The certificate has been uploaded"
            redirect_to :back
        else
            render 'new'
        end
    end

    private

  def certificate_params
    params.require(:certificate).permit(:document, :title, :subscription_id)
  end

end

查看代码:

<%= link_to "upload certificate", new_certificate_path(subscription_id: subscription.id) %>

型号

class Subscription < ActiveRecord::Base
  belongs_to :user
  belongs_to :course
    has_one :certificate
end


class Certificate < ActiveRecord::Base
    belongs_to :subscription

    has_attached_file :document
    #validates_attachment :document, content_type: %w(application/pdf application/msword application/vnd.openxmlformats-officedocument.wordprocessingml.document)
    do_not_validate_attachment_file_type :document
end

证书表格

  <div class="row">
        <div class="site-forms">
                <div class="col-md-10">
                <%= simple_form_for @certificate do |f| %>
                        <!-- <= f.input :course_img, as: :file, required: true, label: "Please upload a brand image for your course" %><br> -->
                        <span class="btn btn-default btn-file">
                            <i class="fa fa-cloud-upload fa-lg"></i> Upload Image
                            <%= f.input :document, as: :file, required: true, label: false %>
                        </span>  Please upload Certificate as PDF <br><br>
                    <%= f.input :title, placeholder: "Course Title", required: true, label: "Course Title" %>
                    <%= f.button :submit, class: "btn btn-primary" %>
                    <% end %>
                </div>
        </div>
  </div>

这可能是我缺少的一些愚蠢的东西,但如果我在控制器中强制注释掉的代码中的整数,我可以让它工作。我几乎可以肯定参数代码是正确的。谢谢。

添加日志

    Started POST "/certificates" for ::1 at 2017-05-23 20:40:30 +0100
Processing by CertificatesController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"6fV0xLOoy6ppNG7PYp37vkKqJnxU17nLPSK/mvbgH8k3s2LyaMEOJlekq5S0Ed4fpbNcqVe+cBsu5F38ACCmcg==", "certificate"=>{"document"=>#<ActionDispatch::Http::UploadedFile:0x007f954362c160 @tempfile=#<Tempfile:/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/RackMultipart20170523-5261-1n2mwfl.png>, @original_filename="duck.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"certificate[document]\"; filename=\"duck.png\"\r\nContent-Type: image/png\r\n">, "title"=>"Test"}, "commit"=>"Create Certificate"}
Command :: PATH=/usr/local/bin/:$PATH; file -b --mime '/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/36846677e3a8f4c0b16d8bdf8ef1860820170523-5261-e90bny.png'
   (0.1ms)  begin transaction
Command :: PATH=/usr/local/bin/:$PATH; file -b --mime '/var/folders/gx/86yj74bx3md88cfn2fwc975h0000gn/T/36846677e3a8f4c0b16d8bdf8ef1860820170523-5261-1d907er.png'
  SQL (0.3ms)  INSERT INTO "certificates" ("document_file_name", "document_content_type", "document_file_size", "document_updated_at", "title", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?, ?)  [["document_file_name", "duck.png"], ["document_content_type", "image/png"], ["document_file_size", 49114], ["document_updated_at", "2017-05-23 19:40:30.662715"], ["title", "Test"], ["created_at", "2017-05-23 19:40:30.683041"], ["updated_at", "2017-05-23 19:40:30.683041"]]
   (0.7ms)  commit transaction
Redirected to http://localhost:3000/certificates/new?subscription_id=3
Completed 302 Found in 36ms (ActiveRecord: 1.1ms)


Started GET "/certificates/new?subscription_id=3" for ::1 at 2017-05-23 20:40:30 +0100
Processing by CertificatesController#new as HTML
  Parameters: {"subscription_id"=>"3"}
  Rendered certificates/_form.html.erb (7.7ms)
  Rendered certificates/new.html.erb within layouts/application (8.7ms)
  Rendered shared/_message.html.erb (0.1ms)
Completed 200 OK in 95ms (Views: 94.3ms | ActiveRecord: 0.0ms)

【问题讨论】:

  • 现在没时间深入研究,稍后再看。但是在这种情况下,我的直觉会立即“接受嵌套属性”。这样,证书控制器可以设置由@certificate.subscription_id 表示的属性。另外,相应的订阅是否已经存在?还是需要.build 命令?
  • 另外,请在尝试保存时发布您的 Web 服务器控制台输出。这样我们就可以看到传递给控制器​​的实际params[]。您的值很可能是 nil,因此除非您在控制器中明确调用 =1,否则这就是正在传递的值。
  • 尝试了我的证书模型中的 accept_nested_attributes 以允许订阅。依然没有。订阅之前已经建立,一旦课程完成,我将向订阅添加证书。除了添加 subscription_id 之外,其他一切都很好,我正在通过参数执行此操作。
  • 查看您的日志:您创建了新证书,但在参数中没有subscription_id。所以params[:subscription_id] 为零。您的表单中的susbscription_id 在哪里?查看您的参数哈希与表单一起返回,是否有 subscription_id: 3 缺少我的任何地方?在提交表单之前,您需要在某处进行设置。如果您不告诉控制器,控制器如何知道它正在处理的订阅的上下文?

标签: ruby-on-rails-4 simple-form strong-parameters


【解决方案1】:

您需要将subscription_id 设置在隐藏字段中,以便在参数哈希中传递。

<%= f.hidden_field :subscription_id, :value => params[:subscription_id] %> 

这样它就可以与其余参数一起设置。

【讨论】:

  • 再次感谢 Beartech,就这么简单。我通过尝试在控制器中添加参数来查看表单。
【解决方案2】:

参数是字符串。试试

@certificate.subscription_id = params[:subscription_id].to_i

【讨论】:

  • 嗯,甚至没有意识到 params 是一个字符串。好的,所以添加 to_i 方法,它会提供一个订阅 ID。现在唯一的错误是订阅 ID 输入为 0。我查看了服务器,当 GET 方法从参数中获取参数时,它显示参数正确,但是当插入表中时,它显示为 0。
  • 参数[:subscription_id] = "1" ?
  • 不,我的意思是如果我在我的控制器中强制 at.certificate.subscription_id = 1 ,我可以让 subscription_id 输入数据库。如果我把 at.certificate.subscription_id = params[:subscription_id] 插入数据库时​​它不会被识别。所以我知道代码正在工作,直到我从 url 中提取参数。 localhost:3000/certificates/new?subscription_id=3
  • 在这个 url 上,localhost:3000/certificates/new?subscription_id=3,如果你记录参数,它显示订阅 id = 0?
  • 嗨,Margo,不,如果我将参数更改为 to_i,它将输入 0。否则它为空,即使我可以看到参数,我也可以在未包含在表中的日志中看到它值正确。它只是不会将参数放入表中。建立的关系在这种方法中有没有发言权?
【解决方案3】:

尝试如下更改此功能

  def certificate_params
     params.require(:certificate).permit(:document, :title, :subscription_id, :subscription)
  end

也许允许参数中的允许订阅字段。

【讨论】:

  • 允许订阅不起作用。不知道为什么它不拉入参数值。这是日志。
  • 似乎您错过了进入创建操作的订阅 ID。使用隐藏字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-23
相关资源
最近更新 更多