Ruby on Rails Generating Views
Solution 1
You can generate the controller and the view using the controller generator.
rails g controller controllername new create
This will create actions new
and create
with their corresponding views.
You still need to set up your routes manually with this.
Solution 2
One particular situation is when you want to add a new view to an existing controller.
In that case, just use the regular command, but be careful to say 'n'
every time prompted in order to not overwrite existing files.
For example, adding a view called 'invite'
to an existing controller named 'projects'
:
smith@ubuntuSrv16DEV4:~/railsapps/project_manager$ rails -v
Rails 5.1.4
smith@ubuntuSrv16DEV4:~/railsapps/project_manager$ rails generate controller projects invite
Running via Spring preloader in process 46253
conflict app/controllers/projects_controller.rb
Overwrite /home/smith/railsapps/project_manager/app/controllers/projects_controller.rb? (enter "h" for help) [Ynaqdh] n
skip app/controllers/projects_controller.rb
route get 'projects/invite'
invoke erb
exist app/views/projects
create app/views/projects/invite.html.erb
invoke test_unit
conflict test/controllers/projects_controller_test.rb
Overwrite /home/smith/railsapps/project_manager/test/controllers/projects_controller_test.rb? (enter "h" for help) [Ynaqdh] n
skip test/controllers/projects_controller_test.rb
invoke helper
identical app/helpers/projects_helper.rb
invoke test_unit
invoke assets
invoke coffee
identical app/assets/javascripts/projects.coffee
invoke scss
conflict app/assets/stylesheets/projects.scss
Overwrite /home/smith/railsapps/project_manager/app/assets/stylesheets/projects.scss? (enter "h" for help) [Ynaqdh] n
skip app/assets/stylesheets/projects.scss
smith@ubuntuSrv16DEV4:~/railsapps/project_manager$
Solution 3
As previously mentioned by sameers there was post that showed how to just generate a the views. It will create all the views for your model using the rails default templates which is very handy.
If like me you want something a little more customizable you can achieve the following.
You can create your own generator so you have something like this.
rails generate view NAME VIEW [options]
To achieve this you need to do the following.
rails generate generator view
This will generate a few files for you in lib/generators/view/ folder.
Open the view_generator.rb file and add the following code.
class ViewGenerator < Rails::Generators::Base
source_root File.expand_path('templates', __dir__)
argument :name, type: :string
argument :action, type: :string
def generate_view
template "#{file_name}.html.erb", "app/views/#{folder_name}/#{file_name}.html.erb"
end
private
def folder_name
name.underscore
end
def file_name
action.underscore
end
def type
name.titleize.singularize
end
def down_type
name.downcase.singularize
end
def render_form
"<%= render 'form', #{down_type}: @#{down_type} %>"
end
def render_link_back
"<%= link_to 'Back', #{folder_name}_path %>"
end
end</pre>
Next you need to create the file that we are using actual template used in generate_view method.
Using the action new as example, create a filelib/generators/view/new.html.erb and add the following.
<h1>New <%= type %></h1>
<%= render_form %>
<%= render_link_back %>
Customize the template view as much as you want. You will need to add the _form.html.erb as well. Add any additional variables and logic in your view_generator.rb file and you are done.
It's more work but can be worth it if you find yourself generating similar views all the time.
Best use case I can think of for this approach is if you white label your platform and need to generate multiple files for a clients profile.
Solution 4
the first part is the name of the model/controller, the second part are the actions.
![Jason Yost](https://i.stack.imgur.com/1SBUi.jpg?s=256&g=1)
Jason Yost
I am a senior software engineer based in CO. I have been developing software for 18 years and have a wealth of experience in both Microsoft and various open source platforms. I enjoy learning new technologies and am just a geek in general.
Updated on July 08, 2022Comments
-
Jason Yost almost 2 years
Is there a way to generate the views separately using the rails generate command? I would also be willing to install a gem to accomplish that task f one exists. Basically the scaffolding command gives me too much and I would rather code my controller by hand. However, writing the index view with a table for the records would not be very efficient.
-
Noz almost 12 yearsHow do you specify a model/controller to generate the views for?
-
Gazler almost 12 yearsViews are generated for the controller.
rails g controller pages about contact
will create the filescontrollers/pages_controller.rb
,views/pages/about.html.erb
,views/pages/contact.html.erb
-
Hussain Akhtar Wahid 'Ghouri' about 11 yearswhat if i just want to add an action to the existing controller and want the view page to be created automatically
-
Gazler about 11 years@HussainAkhtarWahid There is not a generator for it as far as I know. It is fairly trivial to do manually. Create the view.html.erb file, add a new method to the controller then update your routes.
-
CSA about 10 yearsYou can use it github.com/patshaughnessy/view_mapper to generate views based on models. script/generate view_for office --view auto_complete:address
-
Lucio almost 9 yearsIn Rails 4, the routes are generated automatically.
-
W.M. almost 8 yearsThis creates the controllers and the views but they are empty.. No working code in there..
-
S.Yadav almost 6 yearsif app has been created only for API (rails new api_app_name --api -T), will not create any view, helper, assets & test.
-
Yathi about 4 yearsThis is what I was looking for!
-
Dennis Hackethal about 2 yearsYea this. Except in Apr 2022, using Rails 6.1.5, I had to supply the flag
--skip-collision-check
. So the whole command would read something likerails g controller controller_name first_view_name second_view_name --skip-collision-check
. The flag is a bit of a misnomer as it does end up asking you whether to override or keep existing files. It skips the collision check on the payments controller as a whole.