Le blog d'un développeur Ruby on Rails
The jQuery grid plugin is an amazing Javascript project providing multi-functions Ajax datagrids for your web applications. With the 2dcJqgrid Rails plugin, you can now add these datagrids to your Ruby on Rails applications with just a few lines of code.
If you don't like the look & feel of this demo, you can easily customize it using jQuery themes.
Communications between your grids and the server will use the JSON format to exchange data.
The source code of this demo application is available on GitHub.
This solution is compatible with most of web browsers (even Internet Explorer 6 !!).
If you have any comments or suggestions, please post them here.
Inside your Rails application :
def index users = User.find(:all) do if params[:_search] == "true" pseudo =~ "%#{params[:pseudo]}%" if params[:pseudo].present? firstname =~ "%#{params[:firstname]}%" if params[:firstname].present? lastname =~ "%#{params[:lastname]}%" if params[:lastname].present? email =~ "%#{params[:email]}%" if params[:email].present? role =~ "%#{params[:role]}%" if params[:role].present? end paginate :page => params[:page], :per_page => params[:rows] order_by "#{params[:sidx]} #{params[:sord]}" end respond_to do |format| format.html format.json { render :json => users.to_jqgrid_json([:id,:pseudo,:firstname,:lastname,:email,:role], params[:page], params[:rows], users.total_entries) } end end
<%= jqgrid("Football Players", "players", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo" }, { :field => "firstname", :label => "Firstname" }, { :field => "lastname", :label => "Lastname" }, { :field => "email", :label => "Email" }, { :field => "role", :label => "Role" } ] ) %>
<script type="text/javascript">
function handleSelection(id) {
alert('ID selected : ' + id);
}
</script>
<%=jqgrid("Football Players", "players_2", "/users",
[
{ :field => "id", :label => "ID", :width => 35, :resizable => false },
{ :field => "pseudo", :label => "Pseudo" },
{ :field => "firstname", :label => "Firstname" },
{ :field => "lastname", :label => "Lastname" },
{ :field => "email", :label => "Email" },
{ :field => "role", :label => "Role" }
],
{ :selection_handler => "handleSelection" }
)%>
<a href="#" id="players_2_select_button">Get ID of selected row</a>
<%=jqgrid("Football Players", "players_3", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo" }, { :field => "firstname", :label => "Firstname" }, { :field => "lastname", :label => "Lastname" }, { :field => "email", :label => "Email" }, { :field => "role", :label => "Role" } ], { :selection_handler => "handleSelection", :direct_selection => true } )%>
>%=jqgrid("Football Players", "players_4", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo" }, { :field => "firstname", :label => "Firstname" }, { :field => "lastname", :label => "Lastname" }, { :field => "email", :label => "Email" }, { :field => "role", :label => "Role" } ], { :selection_handler => "handleSelection", :multi_selection => true } )%> <a href="#" id="players_4_select_button">Get IDs of selected rows</a>
def pets if params[:id].present? pets = User.find(params[:id]).pets.find(:all) do paginate :page => params[:page], :per_page => params[:rows] order_by "#{params[:sidx]} #{params[:sord]}" end total_entries = pets.total_entries else pets = [] total_entries = 0 end respond_to do |format| format.json { render :json => pets.to_jqgrid_json([:id,:name], params[:page], params[:rows], total_entries) } end end
<%=jqgrid("Football Players", "players_5", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo" }, { :field => "firstname", :label => "Firstname" }, { :field => "lastname", :label => "Lastname" }, { :field => "email", :label => "Email" }, { :field => "role", :label => "Role" } ], { :master_details => true, :details_url => "/users/pets", :details_caption => "Pets" } )%> <br/> <%=jqgrid("Pets", "players_5_details", "/users/pets", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "name", :label => "Name", :width => 500, :align => 'center' } ] )%>
def post_data if params[:oper] == "del" User.find(params[:id]).destroy else user_params = { :pseudo => params[:pseudo], :firstname => params[:firstname], :lastname => params[:lastname], :email => params[:email], :role => params[:role] } if params[:id] == "_empty" User.create(user_params) else User.find(params[:id]).update_attributes(user_params) end end render :nothing => true end
<%=jqgrid("Football Players", "players_6", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo", :editable => true }, { :field => "firstname", :label => "Firstname", :editable => true }, { :field => "lastname", :label => "Lastname", :editable => true }, { :field => "email", :label => "Email", :editable => true }, { :field => "role", :label => "Role", :editable => true } ], { :add => true, :edit => true, :inline_edit => true, :delete => true, :edit_url => "/users/post_data" } )%>
<%=jqgrid("Football Players", "players_7", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo", :editable => true }, { :field => "firstname", :label => "Firstname", :editable => true }, { :field => "lastname", :label => "Lastname", :editable => true }, { :field => "email", :label => "Email", :editable => true }, { :field => "role", :label => "Role", :editable => true } ], { :add => true, :edit => true, :inline_edit => false, :delete => true, :edit_url => "/users/post_data" } )%>
<%=jqgrid("Football Players", "players_8", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo", :editable => true }, { :field => "firstname", :label => "Firstname", :editable => true, :edittype => "checkbox", :editoptions => { :value => "Yes:No" } }, { :field => "lastname", :label => "Lastname", :editable => true }, { :field => "email", :label => "Email", :editable => true, :edittype => "textarea", :editoptions => { :rows => 3, :cols => 30 } }, { :field => "role", :label => "Role", :editable => true, :edittype => "select", :editoptions => { :value => [["admin","admin"], ["player", "player"], ["defender","defender"]] } } ], { :add => true, :edit => true, :inline_edit => true, :delete => true, :edit_url => "/users/post_data" } )%>
<%= jqgrid("Football Players", "players_9", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo" }, { :field => "firstname", :label => "Firstname" }, { :field => "lastname", :label => "Lastname" }, { :field => "email", :label => "Email" }, { :field => "role", :label => "Role" } ], { :subgrid => { :url => "/users/pets", :columns => [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "name", :label => "Name" } ] } } )%>
| Attribute | Values |
|---|---|
| width | Size of the cell |
| align | 'left', 'right', 'center' |
| sortable | true / false |
| resizable | true / false |
| editable | true / false |
<%=jqgrid("Football Players", "players", "/users", [ { :field => "id", :label => "ID", :width => 35, :resizable => false }, { :field => "pseudo", :label => "Pseudo" }, { :field => "firstname", :label => "Firstname" }, { :field => "lastname", :label => "Lastname" }, { :field => "email", :label => "Email" }, { :field => "role", :label => "Role" } ], { :rows_per_page => 30 } )%>
| Attribute | Values |
|---|---|
| rows_per_age | Number of rows per page |
| sort_column | Default sort column |
| sort_order | Default sort order 'asc' / 'desc' |
| grid_loaded | 'javaScriptMethod', the javascript method specified will be called once data are loaded into the grid. |