Sử dụng form_for của Rails nhưng đặt các lớp tùy chỉnh, các thuộc tính trên phần tử <form>?


89

form_fordường như bỏ qua bất kỳ thuộc tính 'bổ sung' nào như data-foothuộc tính hoặc classđược truyền như optionstrong đối số thứ hai của nó.

= form_for @user, {:url => 'foo', :class => 'x', 'data-bar' => 'baz' } do |f|
  # ...

Đầu ra là một <form>thẻ không có xlớp hoặc data-barthuộc tính.

Cách khắc phục là gì?

Hoặc, làm thế nào tôi có thể lấy một FormBuilderphiên bản mà không cần sử dụng form_for?

Câu trả lời:


191

Sử dụng :htmlhàm băm:

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} do |f|

Hoặc là

= form_for @user, html: {class: 'x', data: { bar: 'baz' } } do |f|

1
Tôi thấy rằng điều này không làm việc: = form_for @user, :html => {'class' => 'x'} do |f|. classphải là một biểu tượng thay vì chuỗi.
Trantor Liu

11

Rails 4.0.3, Ruby 2.1.0p0 -> cái này phù hợp với tôi =>

<%= form_for(@contact, :html => {:class => 'form_height'}) do |f| %><% if     @contact.errors.any? %>

4

Tôi gặp vấn đề tương tự nhưng phân vân rằng một biểu mẫu khác ở nơi khác trong ứng dụng của tôi đang hoạt động tốt.

Tôi nhận ra rằng tôi đã vô tình thêm một form_for bên trong một form_for khác mà đã từng loại bỏ đã khắc phục được sự cố.

Thứ hai, tôi nên nói thêm rằng cú pháp này phù hợp với tôi trong Rails 4.2:

<%= form_for @type, html: {class: "form-horizontal"} do |f| %>

Tôi thấy nó thích hợp hơn so với súp chấm câu của các câu trả lời khác ở đây (có lẽ dựa trên phiên bản Rails cũ hơn).


1

Đối với hầu hết các trình trợ giúp, đối số cuối cùng là một băm các tùy chọn html cho phần tử.

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} %>

Bạn cũng có thể kiểm tra các lựa chọn thay thế khác trong tài liệu ActionsView :: Helpers :: FormHelper


1

Tôi đã thử những điều trên không may mắn nhưng đã tìm ra giải pháp. Tôi đang sử dụng đường ray 4.1.6.

Điều này không hoạt động

= form_for @user, :html => {:class => 'x', 'data-bar' => 'baz'} %>

Điều này đã làm

= form_for @user, html: {:class => 'x', 'data-bar' => 'baz'} %>

nhận thấy sự khác biệt với tùy chọn html, hy vọng điều này sẽ giúp


3
Ồ, thật sao? chúng phải tương đương chính xác. Bạn có thể tái tạo điều này? Bạn đang sử dụng phiên bản Ruby nào?
Alan H.

@Alan H. Sử dụng Ruby 2.1.3p242 = form_for(:user, :url => login_path, html: {:class => 'login_form'}) do |f| %> Đây là cách duy nhất để mã của tôi áp dụng lớp, nếu không nó chỉ bỏ qua nó.
doz87

Hai dòng đó hoàn toàn giống hệt nhau. Đoán rằng bạn quên lưu ở giữa?
nathanvda

Tôi biết, họ nên như vậy. Đối với tôi, nó không hoạt động. Lưu không phải là vấn đề.
doz87
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.