From e052ad8859b27a8fea23a43b77f6d7393dec5f4a Mon Sep 17 00:00:00 2001 From: jomo Date: Fri, 2 Aug 2013 07:55:32 +0200 Subject: [PATCH] fixes & forums started --- README.rdoc | 263 +----------------- app/assets/images/bg.png | Bin 0 -> 1495 bytes app/assets/images/bg2.png | Bin 0 -> 8328 bytes app/assets/images/head_bg.png | Bin 0 -> 1015 bytes app/assets/images/logo.png | Bin 3963 -> 19253 bytes app/assets/javascripts/{confirm.js => app.js} | 3 + app/assets/javascripts/application.js | 5 +- app/assets/stylesheets/screen.css.scss | 193 +++++++------ app/controllers/forumgroups_controller.rb | 6 + app/controllers/forums_controller.rb | 2 + app/controllers/sessions_controller.rb | 3 +- app/controllers/users_controller.rb | 12 +- app/helpers/forum_helper.rb | 2 + app/helpers/forums_helper.rb | 2 + app/helpers/users_helper.rb | 2 +- app/models/forum.rb | 3 + app/models/forumgroup.rb | 3 + app/models/user.rb | 2 +- app/views/blogposts/index.html.erb | 9 +- app/views/blogposts/show.html.erb | 32 ++- app/views/comments/_comment.html.erb | 2 +- app/views/forumgroups/index.html.erb | 18 ++ app/views/layouts/_head.html.erb | 26 +- app/views/layouts/application.html.erb | 4 +- app/views/users/edit.html.erb | 4 + app/views/users/show.html.erb | 78 ++++-- config/routes.rb | 7 +- db/migrate/20130802051129_add_forumgroups.rb | 9 + db/migrate/20130802051521_create_forums.rb | 11 + db/schema.rb | 17 +- db/seeds.rb | 18 -- test/fixtures/forumgroups.yml | 11 + test/fixtures/forums.yml | 11 + test/functional/forum_controller_test.rb | 7 + test/functional/forums_controller_test.rb | 7 + test/unit/forum_test.rb | 7 + test/unit/forumgroup_test.rb | 7 + test/unit/helpers/forum_helper_test.rb | 4 + test/unit/helpers/forums_helper_test.rb | 4 + 39 files changed, 358 insertions(+), 436 deletions(-) create mode 100644 app/assets/images/bg.png create mode 100644 app/assets/images/bg2.png create mode 100644 app/assets/images/head_bg.png rename app/assets/javascripts/{confirm.js => app.js} (74%) create mode 100644 app/controllers/forumgroups_controller.rb create mode 100644 app/controllers/forums_controller.rb create mode 100644 app/helpers/forum_helper.rb create mode 100644 app/helpers/forums_helper.rb create mode 100644 app/models/forum.rb create mode 100644 app/models/forumgroup.rb create mode 100644 app/views/forumgroups/index.html.erb create mode 100644 db/migrate/20130802051129_add_forumgroups.rb create mode 100644 db/migrate/20130802051521_create_forums.rb create mode 100644 test/fixtures/forumgroups.yml create mode 100644 test/fixtures/forums.yml create mode 100644 test/functional/forum_controller_test.rb create mode 100644 test/functional/forums_controller_test.rb create mode 100644 test/unit/forum_test.rb create mode 100644 test/unit/forumgroup_test.rb create mode 100644 test/unit/helpers/forum_helper_test.rb create mode 100644 test/unit/helpers/forums_helper_test.rb diff --git a/README.rdoc b/README.rdoc index 7c36f23..1524f99 100644 --- a/README.rdoc +++ b/README.rdoc @@ -1,261 +1,2 @@ -== Welcome to Rails - -Rails is a web-application framework that includes everything needed to create -database-backed web applications according to the Model-View-Control pattern. - -This pattern splits the view (also called the presentation) into "dumb" -templates that are primarily responsible for inserting pre-built data in between -HTML tags. The model contains the "smart" domain objects (such as Account, -Product, Person, Post) that holds all the business logic and knows how to -persist themselves to a database. The controller handles the incoming requests -(such as Save New Account, Update Product, Show Post) by manipulating the model -and directing data to the view. - -In Rails, the model is handled by what's called an object-relational mapping -layer entitled Active Record. This layer allows you to present the data from -database rows as objects and embellish these data objects with business logic -methods. You can read more about Active Record in -link:files/vendor/rails/activerecord/README.html. - -The controller and view are handled by the Action Pack, which handles both -layers by its two parts: Action View and Action Controller. These two layers -are bundled in a single package due to their heavy interdependence. This is -unlike the relationship between the Active Record and Action Pack that is much -more separate. Each of these packages can be used independently outside of -Rails. You can read more about Action Pack in -link:files/vendor/rails/actionpack/README.html. - - -== Getting Started - -1. At the command prompt, create a new Rails application: - rails new myapp (where myapp is the application name) - -2. Change directory to myapp and start the web server: - cd myapp; rails server (run with --help for options) - -3. Go to http://localhost:3000/ and you'll see: - "Welcome aboard: You're riding Ruby on Rails!" - -4. Follow the guidelines to start developing your application. You can find -the following resources handy: - -* The Getting Started Guide: http://guides.rubyonrails.org/getting_started.html -* Ruby on Rails Tutorial Book: http://www.railstutorial.org/ - - -== Debugging Rails - -Sometimes your application goes wrong. Fortunately there are a lot of tools that -will help you debug it and get it back on the rails. - -First area to check is the application log files. Have "tail -f" commands -running on the server.log and development.log. Rails will automatically display -debugging and runtime information to these files. Debugging info will also be -shown in the browser on requests from 127.0.0.1. - -You can also log your own messages directly into the log file from your code -using the Ruby logger class from inside your controllers. Example: - - class WeblogController < ActionController::Base - def destroy - @weblog = Weblog.find(params[:id]) - @weblog.destroy - logger.info("#{Time.now} Destroyed Weblog ID ##{@weblog.id}!") - end - end - -The result will be a message in your log file along the lines of: - - Mon Oct 08 14:22:29 +1000 2007 Destroyed Weblog ID #1! - -More information on how to use the logger is at http://www.ruby-doc.org/core/ - -Also, Ruby documentation can be found at http://www.ruby-lang.org/. There are -several books available online as well: - -* Programming Ruby: http://www.ruby-doc.org/docs/ProgrammingRuby/ (Pickaxe) -* Learn to Program: http://pine.fm/LearnToProgram/ (a beginners guide) - -These two books will bring you up to speed on the Ruby language and also on -programming in general. - - -== Debugger - -Debugger support is available through the debugger command when you start your -Mongrel or WEBrick server with --debugger. This means that you can break out of -execution at any point in the code, investigate and change the model, and then, -resume execution! You need to install ruby-debug to run the server in debugging -mode. With gems, use sudo gem install ruby-debug. Example: - - class WeblogController < ActionController::Base - def index - @posts = Post.all - debugger - end - end - -So the controller will accept the action, run the first line, then present you -with a IRB prompt in the server window. Here you can do things like: - - >> @posts.inspect - => "[#nil, "body"=>nil, "id"=>"1"}>, - #"Rails", "body"=>"Only ten..", "id"=>"2"}>]" - >> @posts.first.title = "hello from a debugger" - => "hello from a debugger" - -...and even better, you can examine how your runtime objects actually work: - - >> f = @posts.first - => #nil, "body"=>nil, "id"=>"1"}> - >> f. - Display all 152 possibilities? (y or n) - -Finally, when you're ready to resume execution, you can enter "cont". - - -== Console - -The console is a Ruby shell, which allows you to interact with your -application's domain model. Here you'll have all parts of the application -configured, just like it is when the application is running. You can inspect -domain models, change values, and save to the database. Starting the script -without arguments will launch it in the development environment. - -To start the console, run rails console from the application -directory. - -Options: - -* Passing the -s, --sandbox argument will rollback any modifications - made to the database. -* Passing an environment name as an argument will load the corresponding - environment. Example: rails console production. - -To reload your controllers and models after launching the console run -reload! - -More information about irb can be found at: -link:http://www.rubycentral.org/pickaxe/irb.html - - -== dbconsole - -You can go to the command line of your database directly through rails -dbconsole. You would be connected to the database with the credentials -defined in database.yml. Starting the script without arguments will connect you -to the development database. Passing an argument will connect you to a different -database, like rails dbconsole production. Currently works for MySQL, -PostgreSQL and SQLite 3. - -== Description of Contents - -The default directory structure of a generated Ruby on Rails application: - - |-- app - | |-- assets - | |-- images - | |-- javascripts - | `-- stylesheets - | |-- controllers - | |-- helpers - | |-- mailers - | |-- models - | `-- views - | `-- layouts - |-- config - | |-- environments - | |-- initializers - | `-- locales - |-- db - |-- doc - |-- lib - | `-- tasks - |-- log - |-- public - |-- script - |-- test - | |-- fixtures - | |-- functional - | |-- integration - | |-- performance - | `-- unit - |-- tmp - | |-- cache - | |-- pids - | |-- sessions - | `-- sockets - `-- vendor - |-- assets - `-- stylesheets - `-- plugins - -app - Holds all the code that's specific to this particular application. - -app/assets - Contains subdirectories for images, stylesheets, and JavaScript files. - -app/controllers - Holds controllers that should be named like weblogs_controller.rb for - automated URL mapping. All controllers should descend from - ApplicationController which itself descends from ActionController::Base. - -app/models - Holds models that should be named like post.rb. Models descend from - ActiveRecord::Base by default. - -app/views - Holds the template files for the view that should be named like - weblogs/index.html.erb for the WeblogsController#index action. All views use - eRuby syntax by default. - -app/views/layouts - Holds the template files for layouts to be used with views. This models the - common header/footer method of wrapping views. In your views, define a layout - using the layout :default and create a file named default.html.erb. - Inside default.html.erb, call <% yield %> to render the view using this - layout. - -app/helpers - Holds view helpers that should be named like weblogs_helper.rb. These are - generated for you automatically when using generators for controllers. - Helpers can be used to wrap functionality for your views into methods. - -config - Configuration files for the Rails environment, the routing map, the database, - and other dependencies. - -db - Contains the database schema in schema.rb. db/migrate contains all the - sequence of Migrations for your schema. - -doc - This directory is where your application documentation will be stored when - generated using rake doc:app - -lib - Application specific libraries. Basically, any kind of custom code that - doesn't belong under controllers, models, or helpers. This directory is in - the load path. - -public - The directory available for the web server. Also contains the dispatchers and the - default HTML files. This should be set as the DOCUMENT_ROOT of your web - server. - -script - Helper scripts for automation and generation. - -test - Unit and functional tests along with fixtures. When using the rails generate - command, template test files will be generated for you and placed in this - directory. - -vendor - External libraries that the application depends on. Also includes the plugins - subdirectory. If the app has frozen rails, those gems also go here, under - vendor/rails/. This directory is in the load path. +== Redstoner.com +I'm too lazy to write something here :D \ No newline at end of file diff --git a/app/assets/images/bg.png b/app/assets/images/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..46b806684c46a611e0ed91b247c96f4bb823a7cd GIT binary patch literal 1495 zcmeAS@N?(olHy`uVBq!ia0y~yU`PaE4kiW$2G5j;FANL}k|nMYCBgY=CFO}lsSJ)O z`AMk?p1FzXsX?iUDV2pMQ*9U+nA0*tB1$5BeXNr6bM+EIYV;~{3m8Da#=fE;F*!T6 zL?J0PJu}Z%>HY5gN(z}Nwo2iqz6QPp&Z!xh9#uuD!Bu`C$yM3OmMKd1b_zBXRu#Dg zxv3?I3Kh9IdBs*0wn|`gt@4VkK*IV;3ScEA*|tg$M@9GsC^+XAr7D=}8S5q+7#b>= znduptn3|ax>L?f)7#ist80j0B=^C0?nVMM{nJYknlAVH0QA(Oskc%7CuA-DQTcwPW zk^(Dz{qpj1y>er{{GxPyLrY6bkQqisxCgqow*eWSOjjhNn@b!fooL3ADsO0=y{ffi_eM3D1{oGuTzrY?YE(uCSI0LKd z;*iRMRQ;gT;{4L0Sp2Q=xStWXkp~yXyNE&X>8_b?qq0U0y6`fUPEJ7Cnr-w6E`PE zCqqM5BTEw#LnmWXR|^AIQzs*1N0?sEyyB9?yyR4vy_uOQR#3ghc=cL27o{eau$h8JcxGNoetEGbD0;wQZ{?C&lv$RV;#QQOs{jsPt4u8R z6ZSVmZwfhKrf;WUqYp|PNQng|6y)LtVuI5(D2>}GATm#CUW%t|k;l|7tDr(<&We*>@w$OOS4cih1VOHnMGgnAToprf+Ax2HBz0D}l z#$;mWuZ4v^TX@bUEy~Ui5bkvjp7BCf>Y&T-0DIxKg+*#A&S!lp+OlQ_@Rk}SN^7M! zSzI}$@^|k3u9Ls5>-mFc2MPo)59AV_x5xc-%c`cLdwchbe>B#t611GWRNTgGEC)Tle_`ctCruREW7>(V;@sG$Dgn&9 zUAMkwEZbFPJALJrSpL*idDn$!O5OTuv20$MZTHHxvHVG|a;^u@n05Or$FhHAch4`$ yxc<~6}6tOelF{r5}E+p;wl>e literal 0 HcmV?d00001 diff --git a/app/assets/images/bg2.png b/app/assets/images/bg2.png new file mode 100644 index 0000000000000000000000000000000000000000..f998ec4018108595595e3e086475136d203b377d GIT binary patch literal 8328 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 literal 0 HcmV?d00001 diff --git a/app/assets/images/logo.png b/app/assets/images/logo.png index ebce70370ac793e31342e6c93c3c80a74a0002e5..82df6d05d718d18975d320a7f6f15aa9d11eb9f2 100644 GIT binary patch literal 19253 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%0D?*zo> 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 diff --git a/app/assets/javascripts/confirm.js b/app/assets/javascripts/app.js similarity index 74% rename from app/assets/javascripts/confirm.js rename to app/assets/javascripts/app.js index 8cdab5e..5fa243f 100644 --- a/app/assets/javascripts/confirm.js +++ b/app/assets/javascripts/app.js @@ -1,6 +1,9 @@ $(function(){ + $('[data-confirm]').click(function(){ var c = confirm($(this).attr('data-confirm')); if (!c) return false; }) + + $('#flash').delay(3000).fadeOut('slow'); }) \ No newline at end of file diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index e8f53e9..f59c271 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -10,8 +10,5 @@ // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD // GO AFTER THE REQUIRES BELOW. // -//= #require jquery -//= #require jquery_ujs -//= #require_tree . //= require jquery -//= require confirm \ No newline at end of file +//= require app \ No newline at end of file diff --git a/app/assets/stylesheets/screen.css.scss b/app/assets/stylesheets/screen.css.scss index 151887d..9e12849 100644 --- a/app/assets/stylesheets/screen.css.scss +++ b/app/assets/stylesheets/screen.css.scss @@ -17,6 +17,10 @@ and (min-width: 1000px) overflow-y: scroll; } + body { + background-image: url('/assets/bg.png'); + } + a { transition: color 0.25s; color: $darkred; @@ -25,67 +29,39 @@ and (min-width: 1000px) color: #F00; } } - #notice { - background: #8e8; + #flash { text-align: center; padding: 10px; - border-bottom: 3px dashed #8d8; - font-weight: bold; - } - #alert { - background: #ebb; - text-align: center; - padding: 10px; - border-bottom: 3px dashed #fdd; font-weight: bold; + position: fixed; + top: 0; + left: 0; + right: 0; + &.notice { + background: #8e8; + border-bottom: 3px dashed #8d8; + } + &.alert { + background: #ebb; + border-bottom: 3px dashed #fdd; + } } #head { - width: 100%; - height: 50px; - background: $lightgrey; - border-bottom: 10px solid $darkgrey; - vertical-align: middle; - font-weight: bold; - box-shadow: 0 0 2px; - z-index: 99; - position: relative; + width: 800px; + margin: -10px auto 20px auto; + padding: 20px 13px 13px 13px; + background-image: url('/assets/head_bg.png'); + box-shadow: 0 0 10px -7px inset; + border-bottom: 1px solid #fff; + border-radius: 0 0 10px 10px; + overflow: hidden; #logo { - margin: 9px; - margin-left: 20px; - height: 32px; - width: 32px; float: left; - background: url('/assets/logo.png'); - } - a { - color: $midgrey; - &:hover { - color: $darkred; - } - } - #menu { - margin: auto; - display: table; - ul { - float: left; - margin-top: 0; - li { - float: left; - height: 100%; - margin: auto 10px; - display: block; - font-size: 2.3em; - } - } } #userinfo { float: right; padding: 0 10px; - margin-top: 6px; - text-align: right; - &.logged-out { - margin-top: 2px; - } + margin-top: 14px; img.avatar { border: 1px solid #000; border-radius: 16px; @@ -103,6 +79,30 @@ and (min-width: 1000px) line-height: 1em; } } + a { + color: $midgrey; + &:hover { + color: $darkred; + } + } + #menu { + width: 100%; + background: url('/assets/head_bg.png') #fff; + input { + display: inline; + } + ul { + float: left; + margin-top: 0; + li { + float: left; + height: 100%; + margin: auto 10px; + display: block; + font-size: 1.5em; + } + } + } } img.user-avatar { border: 1px solid #000; @@ -133,53 +133,50 @@ and (min-width: 1000px) h1 { font-weight: normal; - font-size: 400%; + font-size: 200%; margin: 0; color: #888; text-shadow: 0 1px #999; } } - #posts { - #post { - margin-bottom: 50px; - #post-title { - margin-bottom: 10px; - h2 { - font-weight: normal; - color: #700; - text-transform: uppercase; - display: inline; - font-size: 250%; - } - .comment-counter { - float: right; + .post { + margin-bottom: 50px; + .post-title { + margin-bottom: 10px; + word-wrap: break-word; + h2 { + font-weight: normal; + color: #700; + text-transform: uppercase; + display: inline; + font-size: 200%; + } + .comment-counter { + float: right; + } + } + .post-info { + border-bottom: 2px dashed #999; + color: #888; + a { + color: #755; + &:hover{ + color: #d55; } } } - } - - .post-info { - border-bottom: 2px dashed #999; - color: #888; - a { - color: #755; - &:hover{ - color: #d55; + .post-content { + margin-top: 10px; + clear: both; + word-wrap: break-word; + overflow: hidden; + img { + max-width: 100%; } } } - #post-content { - margin-top: 10px; - clear: both; - word-wrap: break-word; - overflow: hidden; - img { - max-width: 100%; - } - } - #comments { margin: 50px 0 0 40px; .comment { @@ -350,8 +347,34 @@ and (min-width: 1000px) width: 100%; } + .clear { + clear: both; + display: block; + visibility: hidden; + } - + #forum_groups { + .group { + margin: 10px 0; + .header { + background: #ddd; + border-radius: 5px 5px 0 0; + padding: 5px 10px; + border-bottom: 1px solid #ccc; + } + .forums { + border: 1px solid #ddd; + border-top: none; + border-bottom: none; + .forum { + display: block; + font-weight: bold; + padding: 5px 10px; + border-bottom: 1px solid #ddd; + } + } + } + } } \ No newline at end of file diff --git a/app/controllers/forumgroups_controller.rb b/app/controllers/forumgroups_controller.rb new file mode 100644 index 0000000..2cb3a8b --- /dev/null +++ b/app/controllers/forumgroups_controller.rb @@ -0,0 +1,6 @@ +class ForumgroupsController < ApplicationController + + def index + @groups = Forumgroup.all.sort{|s| s[:position]} + end +end \ No newline at end of file diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb new file mode 100644 index 0000000..82573fd --- /dev/null +++ b/app/controllers/forums_controller.rb @@ -0,0 +1,2 @@ +class ForumsController < ApplicationController +end diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index 6a829a9..f3b15f7 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -1,8 +1,9 @@ class SessionsController < ApplicationController + require 'resolv' def create user = User.find_by_email(params[:email]) if user && user.authenticate(params[:password]) - user.last_ip = request.remote_ip + user.last_ip = "#{request.remote_ip} | #{Resolv.getname(request.remote_ip)}" user.last_login = Time.now user.save if user.banned diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index d45d2b4..25a981e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -11,17 +11,17 @@ require 'open-uri' end def show - @user = User.find_by_id(params[:id]) + @user = User.find(params[:id]) unless @user - flash[:alert] = "User ##{params[:id]} does not exist!" + flash[:alert] = "User \"#{params[:id]}\" does not exist!" redirect_to User.find(1) end end - # REGISTER + # SIGNUP def new if current_user - flash[:notice] = "You are already registered!" + flash[:notice] = "You are already signed up!" redirect_to user_path(current_user.id) else @user = User.new @@ -38,7 +38,7 @@ require 'open-uri' def create if current_user - flash[:notice] = "You are already registered!" + flash[:notice] = "You are already signed up!" redirect_to current_user else @user = User.new(params[:user]) @@ -56,7 +56,7 @@ require 'open-uri' if mclogin.downcase.include?(data[:ign].downcase) redirect_to "http://youareanidiot.org/" else - redirect_to @user, notice: 'Successfully registered!' + redirect_to edit_user_path(@user), notice: 'Successfully signed up!' end else flash[:alert] = "Something went wrong" diff --git a/app/helpers/forum_helper.rb b/app/helpers/forum_helper.rb new file mode 100644 index 0000000..cfbd978 --- /dev/null +++ b/app/helpers/forum_helper.rb @@ -0,0 +1,2 @@ +module ForumHelper +end diff --git a/app/helpers/forums_helper.rb b/app/helpers/forums_helper.rb new file mode 100644 index 0000000..2e531fd --- /dev/null +++ b/app/helpers/forums_helper.rb @@ -0,0 +1,2 @@ +module ForumsHelper +end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 696ce4c..6bf993e 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -34,6 +34,6 @@ module UsersHelper def ranks # Lower case !!! - {"default" => 10, "donor" => 40, "mod" => 100, "admin" => 200, "superadmin" => 500} + {"banned" => 1, "unconfirmed" => 5, "default" => 10, "donor" => 40, "mod" => 100, "admin" => 200, "superadmin" => 500} end end \ No newline at end of file diff --git a/app/models/forum.rb b/app/models/forum.rb new file mode 100644 index 0000000..9805c64 --- /dev/null +++ b/app/models/forum.rb @@ -0,0 +1,3 @@ +class Forum < ActiveRecord::Base + belongs_to :forumgroup +end diff --git a/app/models/forumgroup.rb b/app/models/forumgroup.rb new file mode 100644 index 0000000..a3ca2a4 --- /dev/null +++ b/app/models/forumgroup.rb @@ -0,0 +1,3 @@ +class Forumgroup < ActiveRecord::Base + has_many :forums +end diff --git a/app/models/user.rb b/app/models/user.rb index 8ed7def..e3700fe 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -2,7 +2,7 @@ class User < ActiveRecord::Base attr_accessible :name, :ign, :email, :about, :password, :password_confirmation, :rank, :skype, :skype_public, :youtube, :youtube_channelname, :twitter has_secure_password validates_presence_of :password, :name, :email, :ign, :password_confirmation, :on => :create - validates :email, :uniqueness => true + validates :email, uniqueness: {case_sensitive: false} validates :name, :uniqueness => true validates :ign, :uniqueness => true diff --git a/app/views/blogposts/index.html.erb b/app/views/blogposts/index.html.erb index 8189858..4c78ebf 100644 --- a/app/views/blogposts/index.html.erb +++ b/app/views/blogposts/index.html.erb @@ -1,9 +1,8 @@ -

Blog

<% @posts.each do |p| %> -
-
-

<%= link_to p.title, p %>

+
+
+

<%= link_to truncate(p.title, length: 60, omission: " …"), p %>

<%= link_to pluralize(p.comments.count, "Comment"), p %> @@ -11,7 +10,7 @@ -
+
<%= RbbCode.new.convert(p.text).html_safe %>
diff --git a/app/views/blogposts/show.html.erb b/app/views/blogposts/show.html.erb index 81f20b2..934a5fc 100644 --- a/app/views/blogposts/show.html.erb +++ b/app/views/blogposts/show.html.erb @@ -1,15 +1,19 @@ -

<%= @post.title %>

- -
- <%= RbbCode.new.convert(@post.text).html_safe %> -
-
- <% @post.comments.each do |c| %> - <%= render "comments/comment", :c => c %> - <% end %> - <%= render "comments/new" %> +
+
+

<%= @post.title %>

+
+ +
+ <%= RbbCode.new.convert(@post.text).html_safe %> +
+
+ <% @post.comments.each do |c| %> + <%= render "comments/comment", :c => c %> + <% end %> + <%= render "comments/new" %> +
\ No newline at end of file diff --git a/app/views/comments/_comment.html.erb b/app/views/comments/_comment.html.erb index 6290e23..630846a 100644 --- a/app/views/comments/_comment.html.erb +++ b/app/views/comments/_comment.html.erb @@ -4,5 +4,5 @@ <% end %> -
<%= h(c.text).gsub("\n", "
").html_safe %>
+
<%= h(c.text).gsub(/(\w*[\r\n]){3,}/, "\n\n").gsub("\n", "
").html_safe %>
\ No newline at end of file diff --git a/app/views/forumgroups/index.html.erb b/app/views/forumgroups/index.html.erb new file mode 100644 index 0000000..12ebe60 --- /dev/null +++ b/app/views/forumgroups/index.html.erb @@ -0,0 +1,18 @@ +
+ <% @groups.each do |g| %> +
+
+ <%= g.name %> +
+ +
+ <% g.forums.sort{|s| s[:position]}.each do |f| %> +
+ <%= f.name %> +
+ <% end %> +
+ +
+ <% end %> +
\ No newline at end of file diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index fed91d4..125a702 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -1,7 +1,5 @@ +
\ No newline at end of file diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index a482d90..d808417 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -9,8 +9,8 @@ <%= render "/layouts/head" %> -<%= "
#{alert}
".html_safe if alert %> -<%= "
#{notice}
".html_safe if notice %> +<%= "
#{alert}
".html_safe if alert %> +<%= "
#{notice}
".html_safe if notice %>
<%= yield %>
diff --git a/app/views/users/edit.html.erb b/app/views/users/edit.html.erb index 21702c8..e4189fb 100644 --- a/app/views/users/edit.html.erb +++ b/app/views/users/edit.html.erb @@ -3,6 +3,10 @@ <%= simple_form_for @user do |f| %> + + + + diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index a7d7fed..9a24f16 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -12,33 +12,63 @@ <% end %> - <%= image_tag avatar_url(@user.id, 128), :class => "user-avatar avatar", :alt => "avatar" %>
- - <% if @user.banned %> + <% if @user.rank.to_i == rank_to_int("banned") %> This user is banned! <% end %> - - IGN: <%= @user.ign %>
- - Rank: <%= link_to int_to_rank(@user.rank), users_path(:rank => int_to_rank(@user.rank)) %>
- - <% if current_user && @user.skype && (@user.skype_public || current_user == @user || mod?) %> - YouTube: <%= link_to @user.youtube_channelname, "https://youtube.com/user/#{CGI::escape(@user.youtube)}", :target => "_blank" if !@user.youtube.blank? %>
- Twitter: <%= link_to @user.twitter, "https://twitter.com/#{CGI::escape(@user.twitter)}", :target => "_blank" if !@user.twitter.blank? %>
- Skype: <%= @user.skype %>
+ <% if @user.rank.to_i == rank_to_int("unconfirmed") %> + This user hasn't confirmed his email yet! <% end %> - Joined: <%= @user.created_at.strftime("%e. %b %Y") %>
- - <% if mod? %> -
- Last IP: <%= @user.last_ip %>
- Email: <%= @user.email %>
- Last login: <%= @user.last_login.strftime("%e. %b %Y, %H:%M") %> - <% end %> - -
- - <%= @user.about.blank? ? "nothing".html_safe : @user.about.gsub("\n", "
").html_safe %> +<%= image_tag avatar_url(@user.id, 128), :class => "user-avatar avatar", :alt => "avatar" %> +
<%= image_tag avatar_url(@user.id, 128), :class => "user-avatar avatar", :alt => "avatar" %>
Display name <%= f.input :name, :label => false %>
+ + + + + + + + + + <% if current_user && !@user.skype.blank? && (@user.skype_public || current_user == @user || mod?) %> + + + + + <% end %> + <% if !@user.youtube.blank? && @user.youtube_channelname.blank? %> + + + + + <% end %> + <% if !@user.twitter.blank? %> + + + + + <% end %> + + + + + <% if mod? || current_user == @user %> + + + + + + + + + + + + + <% end %> + +
IGN<%= @user.ign %>
Rank<%= link_to int_to_rank(@user.rank), users_path(:rank => int_to_rank(@user.rank)) %>
Skype<%= @user.skype %>
YouTube<%= link_to @user.youtube_channelname, "https://youtube.com/user/#{CGI::escape(@user.youtube)}", :target => "_blank" %>
Twitter<%= link_to @user.twitter, "https://twitter.com/#{CGI::escape(@user.twitter)}", :target => "_blank" %>
Joined<%= @user.created_at.strftime("%e. %b %Y") %>
Last IP<%= @user.last_ip %>
Email<%= mail_to @user.email, @user.email, :subject => "Redstoner" %>
Last login<%= @user.last_login.strftime("%e. %b %Y, %H:%M") %>
+
+ <%= @user.about.blank? ? "nothing".html_safe : h(@user.about).gsub("\n", "
").html_safe %>
\ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index d86c882..e3b8e08 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -12,15 +12,18 @@ Site::Application.routes.draw do end end + resources :forumgroups, :as => 'forums', :path => '/forums' do + + end + match '/serverstatus.png' => 'serverchecker#show' get "logout" => 'sessions#destroy' get 'login' => 'sessions#new' - get 'register' => 'users#new' + get 'signup' => 'users#new' post 'login' => 'sessions#create' post 'paypal' => 'paypal#create' - root :to => 'blogposts#index' end \ No newline at end of file diff --git a/db/migrate/20130802051129_add_forumgroups.rb b/db/migrate/20130802051129_add_forumgroups.rb new file mode 100644 index 0000000..565f5b0 --- /dev/null +++ b/db/migrate/20130802051129_add_forumgroups.rb @@ -0,0 +1,9 @@ +class AddForumgroups < ActiveRecord::Migration + def change + create_table :forumgroups do |t| + t.string :name + t.integer :position + t.timestamps + end + end +end \ No newline at end of file diff --git a/db/migrate/20130802051521_create_forums.rb b/db/migrate/20130802051521_create_forums.rb new file mode 100644 index 0000000..d7017ad --- /dev/null +++ b/db/migrate/20130802051521_create_forums.rb @@ -0,0 +1,11 @@ +class CreateForums < ActiveRecord::Migration + def change + create_table :forums do |t| + t.string "name" + t.integer "position" + t.references :forumgroup + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index a1f6757..26ec139 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20130728003021) do +ActiveRecord::Schema.define(:version => 20130802051521) do create_table "blogposts", :force => true do |t| t.string "title" @@ -29,6 +29,21 @@ ActiveRecord::Schema.define(:version => 20130728003021) do t.datetime "updated_at", :null => false end + create_table "forumgroups", :force => true do |t| + t.string "name" + t.integer "position" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "forums", :force => true do |t| + t.string "name" + t.integer "position" + t.integer "forumgroup_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "users", :force => true do |t| t.string "name", :null => false t.string "ign", :null => false diff --git a/db/seeds.rb b/db/seeds.rb index d61c4a8..3b8c43a 100644 --- a/db/seeds.rb +++ b/db/seeds.rb @@ -1,24 +1,6 @@ # This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rake db:seed (or created alongside the db with db:setup). # -deleted_user = User.new({ - name: "Deleted user", - ign: "Steve", - email: "example@example.com", - about: "Hey, apparently, I do no longer exist. This is just a placeholder profile", - password: "D6^w,:A})@/y>@$18u%D2,_@Se{%>$=,14Nc>#Oz4.[eP$X0p'1fW'%=60H{7]i'H);oX(epMK5B2>/l]t(!_T3p,,]e@Uh%]Vq%[~)_~$?=[6S#8%H&JOd#/#|PRH2/q?!]%(#1;6&_*u&%-+&G-dP*j,1x+@+.6]#6{H$]=I", - password_confirmation: "D6^w,:A})@/y>@$18u%D2,_@Se{%>$=,14Nc>#Oz4.[eP$X0p'1fW'%=60H{7]i'H);oX(epMK5B2>/l]t(!_T3p,,]e@Uh%]Vq%[~)_~$?=[6S#8%H&JOd#/#|PRH2/q?!]%(#1;6&_*u&%-+&G-dP*j,1x+@+.6]#6{H$]=I", - rank: 10 - }) -deleted_user.update_attribute("skype", "echo123") -deleted_user.update_attribute("skype_public", true) -deleted_user.update_attribute("last_ip", "0.0.0.0") -deleted_user.update_attribute("last_login", Time.utc(0).to_datetime) -deleted_user.update_attribute("last_active", Time.utc(0).to_datetime) -deleted_user.update_attribute("created_at", Time.utc(0).to_datetime) -deleted_user.update_attribute("updated_at", Time.utc(0).to_datetime) -deleted_user.save - User.create( name: "Redstone Sheep", ign: "noobkackboon", diff --git a/test/fixtures/forumgroups.yml b/test/fixtures/forumgroups.yml new file mode 100644 index 0000000..c63aac0 --- /dev/null +++ b/test/fixtures/forumgroups.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/fixtures/forums.yml b/test/fixtures/forums.yml new file mode 100644 index 0000000..c63aac0 --- /dev/null +++ b/test/fixtures/forums.yml @@ -0,0 +1,11 @@ +# Read about fixtures at http://api.rubyonrails.org/classes/ActiveRecord/Fixtures.html + +# This model initially had no columns defined. If you add columns to the +# model remove the '{}' from the fixture names and add the columns immediately +# below each fixture, per the syntax in the comments below +# +one: {} +# column: value +# +two: {} +# column: value diff --git a/test/functional/forum_controller_test.rb b/test/functional/forum_controller_test.rb new file mode 100644 index 0000000..143a13c --- /dev/null +++ b/test/functional/forum_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ForumControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/functional/forums_controller_test.rb b/test/functional/forums_controller_test.rb new file mode 100644 index 0000000..601a839 --- /dev/null +++ b/test/functional/forums_controller_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ForumsControllerTest < ActionController::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/forum_test.rb b/test/unit/forum_test.rb new file mode 100644 index 0000000..a6f90e4 --- /dev/null +++ b/test/unit/forum_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ForumTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/forumgroup_test.rb b/test/unit/forumgroup_test.rb new file mode 100644 index 0000000..381763e --- /dev/null +++ b/test/unit/forumgroup_test.rb @@ -0,0 +1,7 @@ +require 'test_helper' + +class ForumgroupTest < ActiveSupport::TestCase + # test "the truth" do + # assert true + # end +end diff --git a/test/unit/helpers/forum_helper_test.rb b/test/unit/helpers/forum_helper_test.rb new file mode 100644 index 0000000..16106f5 --- /dev/null +++ b/test/unit/helpers/forum_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class ForumHelperTest < ActionView::TestCase +end diff --git a/test/unit/helpers/forums_helper_test.rb b/test/unit/helpers/forums_helper_test.rb new file mode 100644 index 0000000..deebfb0 --- /dev/null +++ b/test/unit/helpers/forums_helper_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class ForumsHelperTest < ActionView::TestCase +end