Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding a new field to Rails model

I already created a scafold using

rails generate scaffold myOdb2 columna:integer, columnB:string

now I want to add columnc:string. What should I do?

BTW: question is general but can it be done quicker through Rubymine?

like image 572
Bick Avatar asked Apr 27 '12 14:04

Bick


4 Answers

  • If you've just generated it and realized your mistake you can use:

    rails destroy scaffold myOdb2

    and then re-generate the scaffolding:

    rails generate scaffold myOdb2 columna:integer, columnB:string, columnc:string

  • If you've made some changes to the scaffold-created model that you want to keep but you don't mind destroying the controller and views:

    rails destroy scaffold_controller myOdb2

    then create a migration to add the column:

    rails generate migration add_columnc_to_myodb2s columnc:string

    then re-generate the controller and views:

    rails generate scaffold_controller myOdb2 columna:integer, columnB:string, columnc:string

  • If you've made changes to the controller or views, you'll need to just run the migration to update the database and model, then manually add the new column to each of your views.

like image 23
Nate Avatar answered Nov 11 '22 05:11

Nate


You must generate a migration:

rails g migration add_columnc_to_myodb2s columnc:string

It should contain a row of adding a column to your table.

add_column :myodb2s, :columnc, :string

This adds the column to yourdb table, and of course to your model, but not in any view. You need to add it manually. As far s I know.

like image 188
Matzi Avatar answered Nov 11 '22 06:11

Matzi


no one mentioned updating strong parameters :

So , let us say I have an existing scaffold called myapp and I want to add more fields to that scaffold . Three things to be done .

The field to be added are :

=>

1) rails g migration add_term_count_and_current_record_count_and_previous_record_count_to_myapp term_count:integer , current_record_count:integer , previous_record_count:integer

=>

2) Update views, example updating _form.html.rb

I needed to add :

<div class="field">
    <%= f.label :current_record_count %><br>
    <%= f.number_field :current_record_count%>
  </div>

 <div class="field">
    <%= f.label :current_record_count %><br>
    <%= f.number_field :previouse_record_count%>
  </div>

  <div class="field">
    <%= f.label :term_count  %><br>
    <%= f.number_field :terminations_count %>
  </div>

=>

3) Update Controller : 

New versions of rails has what is called strong parameter to prevent hackers from passing arbitrary column field values. Long story short , update the method with the new fields names , otherwise you will not see the new fields.. they wont get passed to anywhere...untrusted values ;o)

 # Never trust parameters from the scary internet, only allow the white list through.

def vendor_file_params
    params.require(:vendor_file).permit(:name, :run_date,  :term_count ,
    :current_record_count , :previous_record_count ,:comments)   
end
end
like image 5
z atef Avatar answered Nov 11 '22 05:11

z atef


Scaffolding, quick and easy, generates data model and web interface all in once. However, rails generate scaffold is just a way to get started with your model and it helps just at the beginning.

Normally, you first have to extend the data model. This task is simplified by using rails generate migration and rake db:migration. Note that you may prefer to use rake with bundle exec to ensure to use the version of rake in your Gemfile.

Thereafter, you probably want to update (maybe also create new) controllers and views directly, according to the requirements of your web application.

aka MVC

For example, in brand new scaffolded model you may want to update the index and show views (see the app/views folder) and the myOdb2 controller (see the app/controllers folder)

Do not forget to read about migratons http://guides.rubyonrails.org/migrations.html

like image 1
Emiliano Poggi Avatar answered Nov 11 '22 06:11

Emiliano Poggi