文章目录
- css的引入
- rails form_with
- 切分视图重复代码,让代码变得更简洁
- 路由
- 在rails框架中使用js
参考文章
完整代码
用了一下午的时间,大概入了个门
和其他的MVC框架大差小不差
比较有特点的地方就是他真的很方便,方便到有时候你根本不知道代码是啥意思,他会帮你自动定义出很多有用的方法,最厉害的地方就是你根本不知道他们是在哪里定义的
我是跟着官网学的
目前接触到的最复杂的地方是就是articles
控制器了demo\app\controllers\articles_controller.rb
该控制器中有很多action,其中index
action对应的viewC:\Sites\demo\app\views\articles\index.html.erb
中的代码就出现了我上面说的不知道在哪里定义的方法
文件内容如下:
<h1>Listing Articles</h1>
<%= link_to 'New article', new_article_path %>
<table>
<tr>
<th>Title</th>
<th>Text</th>
<th></th>
</tr>
<% @articles.each do |article| %>
<tr>
<td><%= article.title %></td>
<td><%= article.text %></td>
<td><%= link_to 'Show', article_path(article) %></td>
</tr>
<% end %>
</table>
其中new_article_path
和article_path
这两个方法我根本不知道是哪里来的,当我试图把第一个方法的new
改成index
,也就是index_article_path
,爆出了如下错误
不明白为啥只有edit_article_path
和new_article_path
这两个方法
关于第二个方法(article_path)的疑问参考这个回答
同样的,这个方法的定义位置我也不知道
评论区如果有大佬的话可以指点一下
我好像有点懂了
通过在rails应用目录下执行rake routes
,可以得到路由的详情:
这三个就上我们上面说的找不到定义位置的那三个方法,只不过实际使用的时候加了个_path
这样一来,上面的那个StackOverflow上的回答也就明白了,一个post方法一个GET方法,当两个方法名字一样时,rails会根据请求方法是POST还是GET来决定使用哪一个action
css的引入
在进行到数据验证章节时,教程中提到rails会自动将错误的html体包含在一个class=field_with_errors的div标签中,我们可以编写自己的样式表来对他们进行渲染
rails如何知道css在哪呢?
答案是rails有一个统一的位置C:\Sites\demo\app\assets\stylesheets\application.css
,application.css
会把当前目录下的所有csss
文件包含进来,我们要渲染哪个控制器对应的视图,就以哪个控制器命名文件
由于我们渲染的页面是articls控制器的视图,所以我们就在articles.scss
文件中编写样式表,运行效果如下:
rails form_with
我们上面已经出现过form_with scope: :article
这里的scope
是啥意思呢?
参考链接
这个我也不是太清楚
切分视图重复代码,让代码变得更简洁
我们这里拿form_with
举例,我们现在已经写出了new
和edit
视图,这两个视图都用了form_with
,他俩的表单代码几乎是一样的,那么我们就可以把这一部分代码抽取出来,写入到视图目录下的_form.html.erb
,这个命名是有讲究的,第一个字符必须为_
我们这里拿new.html.erb
举例,原来的代码是这样的:
<h1>New Article</h1>
<%= form_with scope: :article, url: articles_path, local: true do |form| %>
<% if @article.errors.any? %>
<div id="error_explanation">
<h2>
<%= pluralize(@article.errors.count, "error") %> prohibited
this article from being saved:
</h2>
<ul>
<% @article.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<p>
<%= form.label :title %><br>
<%= form.text_field :title %>
</p>
<p>
<%= form.label :text %><br>
<%= form.text_area :text %>
</p>
<p>
<%= form.submit %>
</p>
<% end %>
<%= link_to 'Back', articles_path %>
现在我们把form
提取出来,单独写成一个文件之后,新的new.html.rb
是这个样子的
<h1>New Article</h1>
<%= render 'form' %>
<%= link_to 'Back', articles_path %>
路由
创建路由的时候要同时创建出控制器,不然会提示你没有匹配的路由
静态路由的创建是非常简单的,直接编辑config/routes.rb
,在里面加入一行
get test/test
然后创建出test控制器,并定义test动作,还要创建出对应的test视图,然后就完事儿了
在rails框架中使用js
参考文章
注意我们使用的是rails 6,低版本请参考其他文章
在app\javascript\
目录中创建一个目录custom
用来存放我们自己编写的js
文件,在该目录中创建一个custom.js
,内容如下:
window.do_smth = function() {
alert('hello');
}
然后随便找一个视图,添加一个按钮检测效果:
<a href="#" onclick="do_smth()">dosmth</a>
上面的这种使用方式好像不是太好用,因为,我要达到的目标是更新dom,但是经过我的实际测试,使用window.方法名=function()
这种方式定义的方法根本无法满足我的需求,大家可以看一下使用这种方式实现的效果:
可以看到,更更新完成的dom立马又被刷新为原来的样式了,这样对我们来说是没用的
详细使用方式:
参考这篇文章
原文链接
备份地址