簡體   English   中英

Ruby on Rails:控制器中的params []變量

[英]Ruby on Rails: params[] Variable in Controller

我是Ruby(和Rails)的新手,因此對基本問題表示歉意。

據我了解,控制器內部的params[...]變量應該保存我剛剛在網頁上提交的表單中的數據嗎? 我正在嘗試使用以下代碼來更新模型,具體取決於字段是否為空:

@s3_destination = S3Destination.find(params[:id])

if params[:credentials_secret].to_s.empty?

    update = @s3_destination.update_attributes({
         :name => params[:name],
         :bucket => params[:bucket],
         :region => params[:region],
         :credentials_id => params[:credentials_id]
    })

    if update
        redirect_to @s3_destination
    else
        render 'edit'
    end

else

    update = @s3_destination.update_attributes({
         :name => params[:name],
         :bucket => params[:bucket],
         :region => params[:region],
         :credentials_id => params[:credentials_id],
         :credentials_secret => params[:credentials_secret],
    })

    if update
        redirect_to @s3_destination
    else
        render 'edit'
    end

end

控制器動作執行得很好,但是模型中現在沒有數據,因此我假設在update_attributes函數中設置時,我做錯了什么。

params[:name]是否不應該從表單元素中獲取名稱為“ name”的值? 還是我誤解了它的目的?

編輯

要回答一些問題:

我相信這是相關的日志條目,對我來說一切都還好嗎?

Started PATCH "/s3_destinations/1" for 127.0.0.1 at 2015-12-09 12:40:51 +0000
Processing by S3DestinationsController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"a26uTf4+58v/O+pTqOYn0R7cjzGVWBnbFVdJ1OWwNnybEpUdYt2FNruOla/ikOnAFLpY3mn71Wow5oVee+R3Ng==", "s3_destination"=>{"name"=>"Cogative Bucket 1", "bucket"=>"cogative-backup-01", "region"=>"eu-west-1", "credentials_id"=>"AKIAIZG2HJ35NR3DQYGA", "credentials_secret"=>"12345"}, "commit"=>"Save S3 destination", "id"=>"1"}
  User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  S3Destination Load (0.0ms)  SELECT  "s3_destinations".* FROM "s3_destinations" WHERE "s3_destinations"."id" = ? LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
   (0.0ms)  commit transaction
Redirected to http://localhost:3000/s3_destinations/1
Completed 302 Found in 3ms (ActiveRecord: 0.2ms)

表單本身是這樣生成的:

<h2>Editing AWS S3 Destination</h2>

<%= form_for :s3_destination, url: s3_destination_path(@s3_destination), method: :patch do |f| %>

    <% if @s3_destination.errors.any? %>
        <div id="error_explanation">
          <h2>
            <%= pluralize(@s3_destination.errors.count, "error") %> prohibited this source from being saved:
          </h2>
          <ul>
            <% @s3_destination.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
            <% end %>
          </ul>
        </div>
    <%end %>

    <p>
      <%= f.label :name %><br>
      <%= f.text_field :name %>
    </p>

    <p>
      <%= f.label :bucket %><br>
      <%= f.text_field :bucket %>
    </p>

    <select name="s3_destination[region]">
      <option value="us-east-1">US Standard (N. Virginia)</option>
      <option value="us-west-2">US West (Oregon)</option>
      <option value="us-west-1">US West (N. California)</option>
      <option value="eu-west-1">EU (Ireland)</option>
      <option value="eu-central-1">EU (Frankfurt)</option>
      <option value="ap-southeast-1">Asia Pacific (Singapore)</option>
      <option value="ap-southeast-2">Asia Pacific (Sydney)</option>
      <option value="ap-northeast-1">Asia Pacific (Tokyo)</option>
      <option value="sa-east-1">South America (Sao Paulo)</option>
    </select>

    <p>
      <%= f.label :credentials_id %><br>
      <%= f.text_field :credentials_id %>
    </p>

    <p>
      <%= f.label :credentials_secret %><br>
      <%= f.password_field :credentials_secret %>
    </p>

    <p>
      <%= f.submit %>
    </p>

<% end %>

您正在引用params[:name] ,但是所有參數都捆綁在params[:s3_destination] ,因此您需要引用params[:s3_destination][:name]等。

這樣做的好處是,您無需調出要更新的每個屬性。 在簡單的情況下,您可以

@s3_destination.update_attributes(params[:s3_destination])

為了安全起見(例如,為了使我無法編輯表單以提交您不希望我編輯的屬性),應使用強參數

s3_params = params.require(:s3_destination)
  .permit(:name, :bucket, :region, :credentials_id, :credentials_secret)
@s3_destination.update_attributes(s3_params)

然后對於您的credentials_secret邏輯,您只需從此哈希中刪除空白值:

s3_params = params.require(:s3_destination)
  .permit(:name, :bucket, :region, :credentials_id, :credentials_secret)
s3_params.delete(:credentials_secret) if s3_params[:credentials_secret].blank?
@s3_destination.update_attributes(s3_params)

blank? 會同時捕獲nil""即您目前使用.to_s.empty?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM