【问题标题】:Rails & strong_parameters 'required parameter missing'Rails & strong_parameters '缺少必需的参数'
【发布时间】:2014-03-07 07:04:21
【问题描述】:

我正在为我的一个项目创建“转发”(转发)功能,但我一直遇到此错误:

Required parameter missing: restream

我不确定我在这里缺少什么。这是我的设置。有什么想法吗?

模型

#app/models/member.rb
Class Member < ActiveRecord::Base
    has_many :statuses
end

#app/models/status.rb
Class Status< ActiveRecord::Base
    belongs_to :member
    has_many :restreams, class_name: "Status", foreign_key: "restream_id"
end

转播

#config/routes.rb
resources :statuses do
    member do
        post :retweet
    end
end

#app/controllers/statuses_controller.rb
def restream
    @restream = Status.new(restream_params)
    @restream.save
end

private

def restream_params
    params.require(:restream).permit(:restream_id, :content).merge(member_id: current_user.id)
end

#app/views/statuses/show.html.erb
<%= link_to image_tag("Re-Stream 3.png", class: "act_actions", title: "Restream", alt: "Restream"), restream_status_path(status.id), method: :post, :class => "btn restream" %>

【问题讨论】:

  • 这里的错误信息很清楚。您没有将必需的 restream 参数传递给 restream 操作。

标签: ruby-on-rails parameters strong-parameters


【解决方案1】:

您需要传递restream param。您还需要在 get 中发送它,并指定 restream_param 的值,因为它是 link_to.

#app/views/statuses/show.html.erb
<%= link_to image_tag("Re-Stream 3.png", class: "act_actions", title: "Restream", alt: "Restream"), restream_status_path(status.id), params.merge({:restream => "the value you want to pass"})  method: :get, :class => "btn restream" %>

【讨论】:

    【解决方案2】:

    查看params hash in rails 可以很好地解释您的错误:


    示例

    { "company": { "name": "acme", "address": "123 Carrot Street" } }

    你会得到 params[:company] 为 { "name" => "acme", "address" => "123 胡萝卜街”}


    强参数

    为了让您的strong_params 工作,您的参数哈希需要如下所示:

    { "restream": {"your":"params", "go":"here"} }
    

    问题是你的参数哈希看起来像这样:

    {"your":"param", "goes":"here"}
    

    修复

    有两种方法可以解决这个问题:

    def restream_params
        params.permit(:restream_id, :content).merge(member_id: current_user.id)
    end
    

    这将允许:restream_id:content params 无需将它们嵌入到参数哈希的:restream 选项中

    另一个选项是通过您的链接传递:restream 参数。 Sidney 的回答对此很好,但我会使用 form_for,因为我知道这会根据需要设置 params 哈希:

    <%= form_for @restream %>
        <%= text_field :restream_id %>
    <% end %>
    

    【讨论】:

    • 好的,我明白了我遗漏了什么,所以我将代码更改为:&lt;%= link_to image_tag("Re-Stream 3.png", class: "act_actions", title: "Restream", alt: "Restream"), restream_status_path(status.id, restream: "my_restream_object"), method: :post, :class =&gt; "btn restream" %&gt; 我想我只是不确定应该传递什么对象才能使事情正常进行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2018-10-28
    • 2018-12-01
    • 2016-06-29
    相关资源
    最近更新 更多