Cách xóa trường khỏi params [: something]


116

Biểu mẫu đăng ký của tôi, là biểu mẫu cho mô hình Người dùng, nhận một giá trị chuỗi cho công ty. Tuy nhiên, tôi vừa thực hiện một thay đổi để người dùng thuộc về các công ty. Do đó, tôi cần chuyển một đối tượng của Công ty sang mô hình Người dùng.

Tôi muốn sử dụng giá trị chuỗi từ biểu mẫu để lấy đối tượng của Công ty:

@user.company = Company.find_by_name(params[:company])

Tôi tin rằng những điều trên hoạt động, tuy nhiên biểu mẫu đang chuyển: company (là chuỗi) vào mô hình khi tôi gọi:

@user = User.new(params[:user])

Do đó, tôi muốn biết (và không thể tìm cách) để loại bỏ: company param trước khi chuyển nó sang mô hình Người dùng.

Câu trả lời:


209

Rails 4/5 - câu trả lời đã chỉnh sửa (xem phần bình luận)

Vì câu hỏi này đã được viết nên các phiên bản mới hơn của Rails đã thêm phần giải nén! ngoại trừ ví dụ:

new_params = params.except[the one I wish to remove]

Đây là một cách an toàn hơn để 'lấy' tất cả các tham số bạn cần vào một bản sao mà KHÔNG phá hủy bản gốc được chuyển trong các tham số (điều này KHÔNG phải là điều tốt nên làm vì nó sẽ khiến việc gỡ lỗi và bảo trì mã của bạn trở nên rất khó khăn theo thời gian).

Hoặc bạn có thể chuyển trực tiếp mà không cần sao chép, ví dụ:

@person.update(params[:person].except(:admin))

Các extract!(có người điều khiển nổ!) Sẽ thay đổi ban đầu để sử dụng một cách cẩn thận hơn!

Câu trả lời gốc

Bạn có thể xóa cặp khóa / giá trị khỏi Hash bằng cách sử dụng Hash#delete:

params.delete :company

Nếu nó được chứa trong params [: user], thì bạn sẽ sử dụng cái này:

params[:user].delete :company

16
Tôi đang sử dụng Rails 4.0 và model_params.delete :key_namekhông hoạt động - bất kỳ ý kiến ​​nào tại sao?
Zorayr

13
xóa khỏi băm params là một Ý tưởng rất BAD. Mọi người dễ nhầm lẫn trong quá trình gỡ lỗi, v.v ... hãy sử dụng hàm băm tùy chỉnh mà bạn chuyển để gán thuộc tính, ví dụ: sử dụng assin_params = params.dup.delete(:company). không bao giờ xóa từ params trực tiếp
Dominik Goltermann

4
ý tôi làassign_params = params.dup; assign_params.delete(:company)
Dominik Goltermann

12
@Zorayr Tôi đã gặp vấn đề tương tự. Đối với tôi, đó là bởi vì của tôi model_paramslà một hàm, kéo các thông số liên quan từ đó params. Vì vậy, khi bạn deletetừ model_paramsbạn đang thực sự chỉ là xóa từ băm mà model_paramstrả về.
Lucy Bain

1
user_params là một phương thức, vì vậy khi bạn thực hiện user_params.delete (: this_param), nó sẽ tính đúng hàm băm, nhưng mọi lệnh gọi tiếp theo tới user_params sẽ tính toán lại hàm băm từ đầu. Đây là lý do tại sao @Gaul nói rằng đó là một ý tưởng tồi. Trong Rails 5 bây giờ bạn có phương thức params.except và cũng có thể giải nén!
rmcsharry

89

Bạn có thể nên sử dụng hash.except

class MyController < ApplicationController
  def explore_session_params
    params[:explore_session].except(:account_id, :creator)
  end
end

Nó thực hiện được 2 điều: cho phép bạn loại trừ nhiều hơn 1 khóa cùng một lúc và không sửa đổi hàm băm ban đầu.


Rails 4 ActionController :: Các tham số kế thừa Hash, vì vậy hãy ngoại trừ hoặc giải nén! sẽ hoạt động, Trong Rails 5, nó có chức năng ngoại trừ và giải nén! phương pháp quy định tại ActionController :: Các thông số bản thân
kangkyu

Tôi thực sự có tham số băm này trong phương thức UPDATE. Làm thế nào tôi có thể ngoại trừ những người có "-1"là chìa khóa. {"utf8" => "✓", "_method" => "patch", "authenticity_token" => "VtY ...", "brochure" => {"title" => "Hello world", "profiles_attributes" => {"-1" => {"member_profile_id" => "3"}, "0" => {"phần trăm" => "10.0", "description" => "Một số mô tả!", "_Destroy" = > "false", "id" => "10"}, "1" => {...}}, "Sponsorings_attributes" => {"-1" => {"Sponsoring_id" => "2"}, "0" => {"brochure_id" => "

2

Cách chính xác để đạt được điều này là sử dụng strong_params

class UsersController < ApplicationController
  def create
    @user = User.new(user_params)
  end

  private

  def user_params
    params.require(:user).permit(:name, :age)
  end
end

Bằng cách này, bạn có nhiều quyền kiểm soát hơn đối với các thông số sẽ được chuyển đến mô hình


1
respond_to do |format|
  if params[:company].present?
    format.html { redirect_to(:controller => :shopping, :action => :index) }
  else
    format.html
  end
end

điều này sẽ xóa các thông số khỏi url


0

Để có thể xóa, bạn có thể thực hiện một ghi nhớ :

def parameters
  @parameters ||= params.require(:root).permit(:foo, :bar)
end

Bây giờ bạn có thể làm:

parameteres.delete(:bar)
parameters
=> <ActionController::Parameters {"foo" => "foo"} permitted: true>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.