Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to disable all form_for input fields in Ruby on Rails app?

I am trying to DRY up my Rails application a bit, so I would like to render a form in my show view but disable all input fields.

// show.html.erb

<%= form_for(@project) do |f| %>
  <%= render 'fields', :f => f %>
<% end %>

What would be the best way to do that?

Thanks for any help.

like image 638
Tintin81 Avatar asked Nov 04 '12 14:11

Tintin81


2 Answers

Javascript

One way would be to do it using JS. Include a div with a specific class in the show view :

// show.html.erb

<div class='disable_input'>
  <%= form_for(@project) do |f| %>
    <%= render 'fields', :f => f %>
  <% end %>
</div>

Then in your JS file :

$('.disable_input :input').prop('disabled', true);

Rails

If you want to actually generate it server side, you can pass a variable to your partial that will tell the partial if it has to add the disabled option on each field. It's a bit more work though!

Using a variable, you could do something like this :

<%= form_for(@project) do |f| %>
  <%= render 'fields', :f => f, :disabled => true %>
<% end %>

In the partial :

<% disabled ||= false  
   #We do this so if disabled is not passed to the partial it doesn't crash. 
   # We default it to false 
%>

<% # Then for all your fields, add disabled: disabled %>
<%= f.text_field :some_attribute, disabled: disabled %>

Form builder

Edit : actually, one way to avoid explicitly passing disabled everywhere would be to create a Custom form builder. There's some good resources talking about it, like this one : http://johnford.is/writing-a-custom-formbuilder-in-rails/

In this example, it's done for onkeypress, shouldn't be hard to adapt for your case!

like image 59
Anthony Alberto Avatar answered Oct 19 '22 08:10

Anthony Alberto


You can wrap all fields in <fieldset disabled>

// show.html.erb

<%= form_for(@project) do |f| %>
  <fieldset disabled>
    <%= render 'fields', :f => f %>
  </fieldset>
<% end %>
like image 26
pirelly Avatar answered Oct 19 '22 08:10

pirelly