首页 > 其他分享 >ror学习小结6

ror学习小结6

时间:2022-12-08 20:31:07浏览次数:32  
标签:account end ad contract 学习 user ror 小结 locals

1 每个controler都会在app\views下有一个相应的目录 


2 视图中输出debug信息

<%=DEBUG params %>


<%=debug response%>


3 页面上输出

<%=session[:user_name]%>.....

4 XML模版

xml = Builder::XmlMarkup.new(:indent=>2, :margin=>4)

xml.instruct!
ml, :version=>"1.0", :encoding=>"utf-8"

xml.books do

xml.book(:id=>'1') do

xml.name('xxxx')

xml.author('dsdsd')

xml.price ('68')

end

xml.book(:id=>'2') do

xml.name('ddddd')

xml.author('dsd')

xml.price ('98')

end

end

控制器中可以直接对响应设置

format.xml即可


5 image_path("logo.png"); 获得图片路径


6 加载javacript库

javascript_include_tag "prototype"

==<script type="......">

获得某个javascript路径

<%=javascript_path "xxx.js"%>

7 加入css

<%=stylesheet_link_tag "xxxx.css"/>


8 定义数字格式输出

有一系列number_with_xxxx的方法,例子

<% @books.each do |book| %>

<tr style='background:<%= cycle("#ECECEC","#FFFFFF") %>'>

<td><%=number_to_currency( book.id, :unit => "NO.", :format => "%u %


n",:precision => 0) %></td>

<td><%= book.name %></td>

<td><%= number_to_currency(book.price, :unit => "¥", :separator => ".",


:delimiter => ",") %></td>

<td><%= number_to_currency(book.count, :unit => "个", :format => "%n %u")


%></td>

<td><%= link_to '查看', book %></td>

</tr>

<% end %>



9 生成超连接,及表单助手类

link_to link_to_if,link_to_unlses,form_tag等。。。。。


10 form_for

比如控制器中

def add

@employee=Employee.new

end

表单中:

<% form_for(@employee) do |f| %>

........

这样表单提交后,直接

def create

@employee = Employee.new(params[:employee])


respond_to do |format|

if @employee.save

. ...................


11 日期和时间

下拉日期选择框

(选择日期)select_date方法:<%= select_date() %><br/>

(选择日期和时间)select_datetime方法:<%= select_datetime() %><br/>

(选择年)select_year方法:<%= select_year(Time.now,:field_name => 'birth') %


><br/>

(选择月)select_month方法:<%= select_month (Date.today) %><br/>

(选择日)select_day方法:<%= select_day(12) %><br/>

(选择时间)select_time方法:<%= select_time() %><br/>

(选择时)select_hour方法:<%= select_hour(5) %><br/>

(选择分)select_minute方法:<%= select_minute(15) %><br/>

(选择秒)select_second方法:<%= select_second(Time.now) %><br/>


12 自定义模版helper类

可以在app/helpers下创建一个包含helper类的books_helper.rb文件,封装输出的方




module BooksHelper


def index_helper books

html=''

......

end

然后在HTML页中调用:

<%=raw index_helper @books %>


13 cookie

cookie[:myname]="xxxx"

读取myname=cookid[:myname]

删除cookies.delete :myname

cookies[:cart]={:value=>cart,:expires=>Time.now+3600}


14 flash[:notice]="xxxxx"

跨页面传值

<%=notice%>


15 rails异步提交表单

<a href="ajax/new" data-remote="true" id="new">xxxx</xxx>

将异步提交到new这个controller去处理

form_tag标记

<% form_tag("ajax/res",:remote=>true,:id=>"f1") do%>

........

例子:一个页面中有登陆的表单,登陆后,AJAX提交,页面其他部分不变


def login

username=request["user"]["name"]

password=request["user"]["password"]


@username = username

@rule = "VIP用户"


respond_to do |format|

format.html { render :layout => false }

format.xml { render
ml => @ajaxes }

end

end

登陆后的视图:

<br>

<div>您好<span><%= @username %></span>!</div>

<div>您的角色是<span><%= @rule %></span></div>

登陆的表单

<div id="login">

<% form_tag("/ajaxes/login", :remote => true, :id => "lf") do %>

<div>用户名:<%= text_field("user", "name", :class=>"input") %></div>

<div>密 码:<%= password_field("user", "password", :class=>"input") %


></div>

<div><button type="submit">登录</button></div>

<% end %>

</div>


请求的JS

   $(function($) {

$('#lf').bind(

'ajax:success',

function(data, status, xhr) {

$("#login").html(status);

}).bind(

'ajax:error',

function(xhr, status, error) {

alert(error);

});

});


16 文件上传

   def upload

image=params[:img]

content_size=image.size

file_data=image.read

filetype=image.content_type

@filename=image.original_filename

fileext=File.basename(@filename).split(".")[1]

@time=Time.now.to_s

timeext=File.basename(@time).split("+")[0]

newfilename=timeext+"."+fileext

File.open("#{Rails.root}/public/"+ newfilename,"wb"){

|f| f.write(file_data)

}

flash[:notice]="文件:"+ newfilename+"上传成功。"+

"上传时间是:"+(Time.now).to_s+

"上传的地址是:"+ "#{Rails.root}/public/"

render :action=>"uploadImg"

end

   上传表单的设计

      <% form_tag "/carts/upload",:multipart => true do %>

<%= file_field_tag(:img,:size=>"40") %>

<%= submit_tag("上传文件") %>

<% end %>


17 下载文件


send_file方式:

      <%= link_to "下载文件" ,:action=> "downFile",:filename=>"#


{cart.img}.jpg" %>

    downFile控制器内容:

     def downFile

send_file "#{Rails.root}/public/images/"+params[:filename] unless params


[:filename].blank?

end


    send_data方式:

      def downSendData

io=File.open("#{Rails.root}/public/images/"+params[:filename])

io.binmode

send_data(io.read,

:filename=> params[:filename],

:type=>"image.jpg",

:disposition=>"attachment"

)

io.close

end


18 使用CKEDITOR

见 http://www.162cm.com/archives/1156.html的配置

19 使用actionmailer

1)config下的enviroment中添加代码

    ActionMailer::Base.delivery_method=:smtp

ActionMailer::Base.default_charset="UTF-8"

ActionMailer::Base.smtp_settings={

:address=>"smtp.foxmail.com",

:port=>25,

:domain=>"foxmail.com",

:user_name=> "somboy",

:password=> "123456",

:authentication=> :login

}

  2) views\sysemail目录下建立一个发送模版sent.html.erb

    <div>

<p>注册成功,请激活后登录</p>

<p><h3><%[email protected] %>,您好!</h3></p>

<p>请在浏览器的地址栏中输入如下地址来激活您的账户</p>

<p><a href="http://localhost:3000/account/proActivate?name=<%[email protected] %


>&active_code=<%[email protected]_code %>">

http://localhost:3000/account/proActivate?name=<%[email protected] %


>&active_code=<%[email protected]_code %>

</a></p>

</div>

  3) app\mailers\sysemail.rb

class Sysemail < ActionMailer::Base

default :from => "[email protected]"


# Subject can be set in your I18n file at config/locales/en.yml

# with the following lookup:

#

# en.sysemail.sent.subject

#

def sent(user,sent_at=Time.now)

subject "激活邮件,来自【dddd】"

recipients user.email

from "[email protected]"

sent_on sent_at

body :user=>user

content_type "text/html"

end


4) 发送的逻辑,比如保存用户后发送:

    def proReg

@user=User.new(params[:user])

@user.active_code=rand(Time.now.to_i).to_s

@user.is_actived=0

if @user.save then

flash[:notice]="success"

flash[:name][email protected]

Sysemail.deliver_sent(@user)

render "Sysemail/sent"


20 页面缓存

  启动缓存:

   修改config/enviroments/development.rb中设置

    config.action_controller.perform_caching=true

使用:

    cache_page :index(设置使用缓存的页面)

  清除cache

expire_page (:action=>"index")

局部缓存:

    <%cache do%>

//视图中的代码

    <%end%>

当失效时:

     expire_fragment :action=>"show"


21 分页器

使用will_paginate库

gem 'will_paginate','3.0.pre2'

@tabflowers=Tabflower.paginate :page => params[:page], :per_page => 9

sql="select count(*) from tabflowers"

@totalTS=Tabflower.count_by_sql(sql)

totalTS=Tabflower.count_by_sql(sql)

@currentYS=params[:page]

@perPage=9

perPage=9

if totalTS % perPage!=0

totalJY=totalTS / perPage+1

else

totalJY=totalTS / perPage

end

@totalJY=totalJY

@tabuser=session[:tabuser]

respond_to do |format|

format.html # index.html.erb

format.xml { render
ml => @tabflowers }

end


视图页中

<tr><td>共<%=@totalJY %>页,共<%= @totalTS %>条,每页显示<%=@perPage %>条</td><td><%=


will_paginate @tabflowers,:prev_label=> "上一页",:next_label=>:"下一页" %></td></tr>


16 全局配置信息。比如在config目录下新建site.yml配置文件:

title:xxxx

author:xxxx


在lib/enki/config.rb文件中,载入配置文件

def self.default_location

"#{Rails.root}/config/site.yml"

end


然后在app/controlers/application_controller.rb中,进行全局编码和全局变量的加载

class ApplicationController < ActionController::Base

protect_from_forgery

after_filter :set_content_type


protected


def set_content_type

headers['Content-Type'] ||= 'text/html; charset=utf-8'

end


def enki_config

@@enki_config = Enki::Config.default

end

helper_method :enki_config

end

在前端页面中调用显示这些变量的值 <%=enki_config[:title]%>


17 content_for的用法

如果我们想根据模板页面更改局部layout,使用content_for即可。

content_for允许模板页面代码放到layout中的任何位置。


比如我们的Rails程序不同的页面有不同的css样式,我们可以在layout里留出位置:

Java代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

<head>

<title>Todo List</title>

<%= stylesheet_link_tag 'application' %>

<%= yield :head %>

</head>

<body>

<div id="container">

<h1>Todo List</h1>

<%= yield %>

</div>

</body>

</html>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>

<head>

<title>Todo List</title>

<%= stylesheet_link_tag 'application' %>

<%= yield :head %>

</head>

<body>

<div id="container">

<h1>Todo List</h1>

<%= yield %>

</div>

</body>

</html>


我们用yield :head来给模板页面某段代码留个"座位",再看页面:

Java代码

<% content_for :head do %>

<%= stylesheet_link_tag 'projects' %>

<% end %>

<h2>Projects</h2>

<ul>

<% for project in @projects %>

<li><%= project.name %></li>

<% end %>


<% content_for :head do %>

<%= stylesheet_link_tag 'projects' %>

<% end %>

<h2>Projects</h2>

<ul>

<% for project in @projects %>

<li><%= project.name %></li>

<% end %>


content_for :head里面的代码将填充layout里的yield :head。


18 render partial参数



1. 默认参数


Ruby代码

<%= render :partial => "account" %>


<%= render :partial => "account" %>

默认本地有个变量@account, 传递过去,render到的partial(_account.erb)有个变量account


2. 单独参数 locals

locals传递一组hash参数hash 值是本地的变量,hash的key是partial里的变量


Ruby代码

<%= render :partial => "account", :locals => { :account => @buyer } %>



<% for ad in @advertisements %>

<%= render :partial => "ad", :locals => { :ad => ad } %>

<% end %>


<%= render :partial => "account", :locals => { :account => @buyer } %>


<% for ad in @advertisements %>

<%= render :partial => "ad", :locals => { :ad => ad } %>

<% end %>

上面两个render分别

传递本地变量@buyer到_account.erb里叫account的参数

传递本地变量ad到_ad.erb里叫ad


3


根据1默认参数下面两个是一样的


Ruby代码

<%= render :partial => "contract", :locals => { :contract => @contract } %>



<%= render :partial => "contract" %>


<%= render :partial => "contract", :locals => { :contract => @contract } %>


<%= render :partial => "contract" %>



4. as使用


用来改变传递之后,partial里变量的名称,如下,render方式是一样的。


Ruby代码

<%= render :partial => "contract", :as => :agreement



<%= render :partial => "contract", :locals => { :agreement => @contract }


<%= render :partial => "contract", :as => :agreement


<%= render :partial => "contract", :locals => { :agreement => @contract }

传递@contract到_contract.erb里,partial里的变量名为agreement


5. object使用


object最简单,就是把一个变量原名传递到partial里,

所以什么都记不清楚的时候,就用object多写点都能表达


如下:

Ruby代码

<%= render :partial => "account",
bject => @buyer %>



<% for ad in @advertisements %>

<%= render :partial => "ad",
bject => ad %>

<% end %>


<%= render :partial => "account",
bject => @buyer %>


<% for ad in @advertisements %>

<%= render :partial => "ad",
bject => ad %>

<% end %>

传递@buyer到_account.erb的partial里变量名还是@buyer

传递ad到_ad.erb的partial里变量名还是ad


6 object和as合用


Ruby代码

<%= render :partial => "contract",
bject => @contract, :as => :contract %>



<%= render :partial => "contract" %>


<%= render :partial => "contract",
bject => @contract, :as => :contract %>


<%= render :partial => "contract" %>


7 collection


Ruby代码

<%= render :partial => "ad", :collection => @advertisements %>


<%= render :partial => "ad", :collection => @advertisements %>


@advertisements是一个array,partial里_ad.erb有个ad变量是@advertisements的成员。就是_ad.erb不用写loop只


是一条广告显示。


Ruby代码

<%= render :partial => "ad", :collection => @advertisements, :spacer_template => "ad_divider" %>


<%= render :partial => "ad", :collection => @advertisements, :spacer_template => "ad_divider" %>

同上,循环显示_ad.erb _ad_divider.erb 显示@advertisements.size次其中partial_ad_counter是默认计数器表示


第几条广告


8 默认


看你要partial的变量是一组记录还是一条记录,会对应约定用locals和collection

Ruby代码

#@account是一条记录

# <%= render :partial => "accounts/account", :locals => { :account => @account} %>

<%= render :partial => @account %>



# @posts是一组记录

# <%= render :partial => "posts/post", :collection => @posts %>

<%= render :partial => @posts %>


#@account是一条记录

# <%= render :partial => "accounts/account", :locals => { :account => @account} %>

<%= render :partial => @account %>


# @posts是一组记录

# <%= render :partial => "posts/post", :collection => @posts %>

<%= render :partial => @posts %>

这是很人性的约定,可有时候就是忘了


9 一些漂亮的简写


Ruby代码

#<%= render :partial => "account" %>可用下面代替

<%= render "account" %>



#<%= render :partial => "account", :locals => { :account => @buyer } %>可用下面代替

<%= render "account", :account => @buyer %>



# @account是一条记录

# <%= render :partial => "accounts/account", :locals => { :account => @account } %>可用下面代替

<%= render(@account) %>



# @posts是一组记录

# <%= render :partial => "posts/post", :collection => @posts %>可用下面代替

<%= render(@posts) %>


#<%= render :partial => "account" %>可用下面代替

<%= render "account" %>


#<%= render :partial => "account", :locals => { :account => @buyer } %>可用下面代替

<%= render "account", :account => @buyer %>


# @account是一条记录

# <%= render :partial => "accounts/account", :locals => { :account => @account } %>可用下面代替

<%= render(@account) %>


# @posts是一组记录

# <%= render :partial => "posts/post", :collection => @posts %>可用下面代替

<%= render(@posts) %>


10 layout


Ruby代码

<%# app/views/users/index.html.erb &>

Here's the administrator:

<%= render :partial => "user", :layout => "administrator", :locals => { :user => administrator } %>



Here's the editor:

<%= render :partial => "user", :layout => "editor", :locals => { :user => editor } %>



<%# app/views/users/_user.html.erb &>

Name: <%= user.name %>



<%# app/views/users/_administrator.html.erb &>

<div id="administrator">

Budget: $<%= user.budget %>

<%= yield %>

</div>



<%# app/views/users/_editor.html.erb &>

<div id="editor">

Deadline: <%= user.deadline %>

<%= yield %>

</div>

标签:account,end,ad,contract,学习,user,ror,小结,locals
From: https://blog.51cto.com/u_14230175/5923424

相关文章

  • ACM学习路线
    简单的概括一下ACM入门的学习路线。1.基础算法模拟枚举贪心打表排序递归,递推分治构造二分(二分查找,二分答案)高精度前缀和,差分双指针位运算离散化区间合并2......
  • wince 蓝牙 学习
    蓝牙命令1.向蓝牙设备发送命令bccmd-tbcsp-d/dev/ttymxc1psload-r/etc/bluetooth/BC6QFN.psr-t指定通讯协议bcsp为蓝牙核心串口协议-d指定执行命令的......
  • fatal error C1083: Cannot open include file: 'soc_cfg.h': No such file or direct
    fatalerrorC1083:Cannotopenincludefile:'soc_cfg.h':NosuchfileordirectoryfatalerrorC1083:Cannotopenincludefile:'intr_reg.h':Nosuchfileordi......
  • django框架之基础学习
    目录纯手撸web框架基于wsgiref模块代码封装优化动静态网页jinja模板前端、后端、数据库三者联动python主流web框架Django简介Django基本使用djangoapp的概念django的主要......
  • 翟老师的学习方法
    人皆云,业精于勤,勤能补拙。但是在很多时候,即便你花了很多时间练习,你的水平还是很难提高。比如说,有的孩子学书法,跟着老师学了很久,上课练的时候似乎写得不错,但是跟着......
  • Docker学习笔记十:Docker安装Nginx
    准备下载命令:dockerpullnginx安装可参考Docker Hub官网说明的镜像的用法  安装 第一步:简单安装创建容器命令:dockerrun-d--name=nginx-p8111:8080......
  • Fiddler error–HTTPS handshake failed
    情景描述当我在电脑上通过修改host文件,试图将某个软件的请求代理到我自己搭建服务上时,服务一直收不到请求。于是打开Fiddler观察发生了什么,等再次访问时,得到了如下......
  • Github Actions 学习笔记
    GithubActions是什么?GithubActions官方介绍:GitHubActions是一个持续集成和持续交付(CI/CD)平台,允许您自动化构建、测试和部署管道。您可以创建构建和测试存储库中的每......
  • LWIP 的ethernetif.c 学习
     《嵌入式网络那些事-LwIP协议深度剖析与实战演练》学习 ethernetif.c netif.c 在 LWIP中,是通过一个叫做结构体:structnetif{structnetif*next;//指向下一个......
  • JSON学习
     作者:MiloYip1、 JSON是什么JSON(JavaScriptObjectNotation)是一个用于数据交换的文本格式,现时的标准为ECMA-404。虽然JSON源至于JavaScript语言,但它只是一种数据......