Rails

第一个Rails半成品的一些经验

Posted on

简单说就是数据库课设,趁我现在保留着对整个程序的开发过程,这里简单阐述一些过程。
因为以前忘的多了,加上比赛啊,什么的,有点赶,还有两个功能没能实现,不过勉强还是能拿出手

主要学习来源
向作者ihower致敬

顺便在最前面展示一下成果主页
主页

Rails 核心思想

众所周知,Rails 以开发速度闻名,我写完统计了一下代码量,所有代码应该不包含注释也不过 400 行多一点。
代码统计
而其核心思想在于规定化,也可说是标准化。用一些内置函数去生成代码。
举个例子,在路由(Route)上,根据MVC规则,每一个网址都应该有一条路由与之相对应。rails则使用标准化的RESTful
而因为是函数,所以它的参数都必须与其相对应,所照成的缺陷也很显然,内置函数使用上限不足,完美自定义的网站仍需要自己去架构。为此Rails 也构造了更多的内置函数,为的是提高总体使用上限。当然所造成的结果会是有一些函数的作用重叠。但这并不影响,反而完全符合Ruby的哲学。

Rails 各目录简介

  • app/assets 保存着各种样式文件 包括css,js,和一些图片
  • app/controller 保存着控制器文件
  • app/helper 保存着各个控制其对应的自定义helper文件,关于helper,请移步 传送门
  • app/models 保存着各个模型文件
  • app/views 保存着各个视图文件
  • bin 一些二进制文件,不同管它
  • cofig 配置文件目录,包含了开发环境(environments),初始化配置(initializers),数据库配置(database.yml),路由配置(routes.rb) 等
  • db 数据库相关,其中的子目录 migrate 是数据库迁移文件目录
  • lib 不知道干嘛用,也没用过
  • log 日志文件目录,包含三个环境运行Rails的日志及其他日志
  • public 公共目录,一些共有的文件(比如一些上传文件)都会默认保存在这个目录
  • vendor 没用过…………
  • 其他在根目录但不在任何目录的重要一点的文件也就 Gemfile 和 README.md 了,README都知道的,gemfile 保存着在项目中需要的一些 gem

几个常用helper

form_for

一个最常用也是最需要掌握的是 form_for 表格生成 helper
form_for有些复杂,最好还是移步 RailsAPI
一般是 form_for 对象, 路径, 选项, 块
其中对象必不可缺,其他都是可以缺省的

image_tag与 image_path

image_tag(路径,选项) 用于显示图片
image_path(不带后缀的图片名) 用于寻找图片并生成图片路径,一般优先在 app/assets 中查找

link_to

字面意思,就是链接,一般用法为
link_to 链接名, 链接路径, 选项, 块

button_to 与 button_tag

button_tolink_to极为相似,但毕竟是 button,button_to的type内置为 submit 无法修改,若要更高的自由度,就得使用 button_tag
用法基本一致

link_to 链接名, 链接路径, 选项, 块
link_tag 链接名, 链接路径, 选项, 块

为只为样式使用按钮而不用链接,可以在button_tag的基础上加个onclick属性即可

几个相关gem

这里不发链接了,在github输一下就找到了

  • bootstrap-sass 使用bootstrap的基础
  • bootstrap-datepicker-rails 优秀的日期选择
  • ransack 自定义筛选
  • devise 用户注册管理
  • rolify 用户角色管理
  • cancancan 用于权限管理
  • carrierwave 文件上传

几个新人容易出错的地方

  • rails 的 css 在开发过程中是默认锁定的,所以你在 css 中增加样式默认没有任何变化
  • 关于资料验证和必填属性,资料验证(params)一般来说没有选择性,你必须吧所有元素都填上,而必填属性(validates_presence_of) 则可以自由选择
  • 在建立项目之前务必理清楚数据对象之间的关系,当然如果搞错了也可以新建迁移(migrate),若要重建model,必须删除同名表,操作为 进入rails控制台 rails c,输入 ActiveRecord::Migration.drop_table(:users) # users is table name
  • flash 是一种“闪存”变量,这种变量你一刷新,它所保存的东西就没了,其值为 nil
  • 设置路由的时候难免会有冲突,优先级从上往下

暂时只想到这么多,其他的东西都能在最上面的学习资料中找到,我这里只讲了一些个人经验。

Rails

Rails 使用 carrierwave 上传文件

Posted on

……崩溃,找了很久的资料,最后找到一份template才解决问题。

carrierwave是一个rails 上传文件的 gem,然而用不来……
作者在 github 上的文档真的很没有条理性

前言

偶然间看到这篇文章,希望读者也可以多思考一下。
现在框架发展这么迅速,各种api泛滥,我们在寻求解决一个问题的时候,往往会有点急功近利。如果你考虑了底层实现,那你才是真正学到了东西,并能广泛运用它。否则,你顶多只是积累了当前框架或者api的使用经验。换了一个框架你就完全不会了。

但我的确是看完了这篇文章,我也的确去思考了,但是还是不会用!!!
因为网上很多文章和博客都忽略了一个非常重要的地方,下面我会说明。

这里详细介绍一下 carrierwave 的用法,并假设你已经开了上面那篇文章并思考过了。

安装

首先是安装,在gemfile中输入 gem 'carrierwave', '~> 1.0' 并执行 bundle install

carrierwave 实际建立的是 model ,但这里便于区分并且生成的类同时也是 uploader ,输入命令

rails generate uploader Image

这里的 Image 是由你自己取名的 uploader ,输完后就会生成一个 ruby文件,关于文件上传的一些设置一般都是在这个文件中。

app/uploaders/image_uploader.rb

View

根据MVC,我们先写 views ,一般是在某个目录下的 new.html.erb

<%= form_for @comic, :url => comics_path,:html => {:multipart => true} do |t|%>
# 其他代码

    <br><%= t.label :image, '漫画封面' %></br>
    <%= t.file_field :image %>
    <%= t.hidden_field :image_cache %>

# 其他代码
<% end %>

这里一定一定一定要注意, :html => { :multipart => true } 这个hash一定要加!!!只有加了这个才能上传文件,别问我什么意思,什么道理,我不知道……

Controller

然后是controller,一般为 某个目录下的 create 函数
其实在controller只要和平常一样操作即可,这里还是放上我写的吧

  def create
    @comic = Comic.new(comic_params)

    if @comic.save
        # 其他代码
    else
        # 其他代码
    end
  end

Uploader 的 其他配置

太复杂的高级用法我就不说了,更何况我自己也不会

在预生成的 *_uploader.rb 文件中, 你可以通过重载若干函数来实现你的自定义

store_dir

非重载函数,意思为上传目录,上传目录的相对路径根目录在 public,路径问题上你可以自己设置

extension_whitelist

重载函数,意思为上传文件白名单,默认为所有文件

filename

重载函数,用途为更改文件名,默认和 变量 original_name 相同

default_url

重载函数,虽然没用过,但是看文档还是看懂了,意为默认文件,如果你没有上传任意文件,就将你设置的 default_url 传给你 new 的对象

其他就不是很清楚了。

图片的使用

因为在我的课设中只会上传图片,这里说一下上传图片的使用

因为新增加的类是 uploader ,它实质上有很多属性,比如,filename, original_name, store_dir, url 等等
,而我们显示图片其实只需要一个 url 即可。

在 View 中输入

<%= image_tag comic.image_url %>

就可以显示当前 comic 的 image