ruby-on-rails - 在 ruby​​ 中使用 params.require 保存多条记录

标签 ruby-on-rails ruby ruby-on-rails-4 parameters

我正在尝试更新多条记录。表单生成罚款并提交罚款并发送数据。查找记录以进行更新,但不会保存任何数据。下面有我的 Controller 逻辑、表单逻辑和控制台转储。我试图复制安东尼·刘易斯 put together 的内容但我有一种感觉,我没有将正确的数据传递到 params.require().permit() 方法或正确定义 params.require().permit() 方法。预先感谢您的帮助!

class ConfigController < ApplicationController

  def edit

    @services = Service.all

  end

  def update

    params["service"].keys.each do |id|
      @service = Service.find(id.to_i)
      @service.update_attributes!(service_params)
    end

    redirect_to config_url

  end

private

  def service_params
    params.require(:service).permit(:id, :client_id, :client_secret)
  end


end

表单代码为:

  <%= form_for :service, :url => update_config_path, :html => { :class => "form-horizontal", :method => "put", :remote => true } do %>
    <% @services.each do |s| %>
      <%= fields_for "service[]", s do |service_field| %>
        <fieldset>
          <legend><%= s.name %></legend>
          <div class="form-group">
            <%= service_field.label :client_id, "Consumer Key", :class => "col-sm-2 control-label" %>
            <div class="col-sm-10">
              <%= service_field.text_field :client_id, :class => "form-control" %>
            </div>
          </div>
          <div class="form-group">
            <%= service_field.label :client_secret, "Consumer Secret", :class => "col-sm-2 control-label" %>
            <div class="col-sm-10">
              <%= service_field.text_field :client_secret, :class => "form-control" %>
            </div>
          </div>
        </fieldset>
      <% end %>
    <% end %>

    <%= submit_tag %>

  <% end %>

控制台读取:

Started PUT "/config" for 127.0.0.1 at 2013-11-22 15:44:08 -0800
Processing by ConfigController#update as JS
  Parameters: {"utf8"=>"✓", "service"=>{"1"=>{"client_id"=>"testid", "client_secret"=>"testsecret"}, "2"=>{"client_id"=>"testkey", "client_secret"=>""}, "3"=>{"client_id"=>"", "client_secret"=>""}}, "commit"=>"Save changes"}
  Service Load (0.3ms)  SELECT "services".* FROM "services" WHERE "services"."id" = $1 LIMIT 1  [["id", 1]]
Unpermitted parameters: 1, 2, 3
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
Unpermitted parameters: 1, 2, 3
{}
  Service Load (0.2ms)  SELECT "services".* FROM "services" WHERE "services"."id" = $1 LIMIT 1  [["id", 2]]
Unpermitted parameters: 1, 2, 3
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
Unpermitted parameters: 1, 2, 3
{}
  Service Load (0.2ms)  SELECT "services".* FROM "services" WHERE "services"."id" = $1 LIMIT 1  [["id", 3]]
Unpermitted parameters: 1, 2, 3
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
Unpermitted parameters: 1, 2, 3
{}
Redirected to http://localhost:3000/config
Completed 302 Found in 6ms (ActiveRecord: 1.1ms)

最佳答案

我找到了一个解决方案,但也许不是最好的。如果有人有更好的想法,请告诉我,我很乐意尝试!

在解决方案中,我更新了 Controller update 操作和 service_params

我将 id 传递给 service_params 并在 require 方法上调用 fetch 方法来获取正确的参数。我注意到在控制台中,它在保存每条记录时读取了 Unpermissed parameters: 1, 2, 3 ,指示参数是一个数组,我还注意到在 @Vijay 的解决方案中,他试图缩小参数范围以及。经过一些谷歌搜索和控制台日志记录后,我想出了下面的代码。

def update

  params["service"].keys.each do |id|
    @service = Service.find(id.to_i)
    @service.update_attributes!(service_params(id))
  end

  redirect_to config_url

end

def service_params(id)
  params.require(:service).fetch(id).permit( :client_id, :client_secret )
end

你觉得怎么样?

关于ruby-on-rails - 在 ruby​​ 中使用 params.require 保存多条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20156664/

相关文章:

jquery - Uncaught Rickshaw.Graph 需要对元素index.js.erb 的引用

ruby-on-rails - 一个 Rails 资源的多个路径

ruby-on-rails - Rails render_to_string 使用错误的格式

mysql - 在 Ruby on Rails 中动态连接到第二个 MySQL 数据库

ruby-on-rails - 为什么使用连接并包含 find_each 会导致不正确的迭代计数

ruby - 在 Ruby 中,如何通过 Sinatra 获取 `li` 标记内的链接?

ruby-on-rails - 更好的随机化方法 (Ruby/Rails 3)

ruby-on-rails - Strong Params : params. permit 返回 Unpermitted parameters despite whitelist

javascript - 通过 AJAX 更改 link_to 参数

ruby-on-rails - 用于嵌套索引操作的 Rails 多态链接