论坛首页 入门技术论坛

rails中scaffold自动生成的CRUD,我怎样修改渲染的表单

浏览 2375 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-10-24  

目标:做一个博客系统,有两张表,分类(post_categories)和文章(posts).想保持rails的scaffold,尽量减少代码编写,来完成CRUD功能。

1。数据库表:

\db\migrate\002_create_post_categories.rb
create_table :post_categories do |t|
       t.column :name, :string, :null =>false

\db\migrate\002_create_post.rb
create_table :posts do |t|
       t.column :category_id,   :integer, :null =>false
       t.column :title, :string
       t.column :doc,   :text
       t.column :addTime,   :datetime, :default =>'0000-00-00 00:00:00'
       t.column :isOpen, :boolean, :default =>true
       t.column :acount,   :int, :default =>1
     end
     execute "alter table posts add constraint fk_post_category   foreign key (category_id)
     references post_categories(id)"

2.用generate生成Models和Controllers

3.用generate生成views:

generate:scaffold
model name: post
controller name:post
actions:post

默认情况下,我们看到:\app\views\post\new.rhtml
<% form_tag :action => 'create' do %>
   <%= render :partial => 'form' %>
   <%= submit_tag "Create" %>
<% end %>

但因为posts外键连接了表post_categories,而以上的表单没有指定category_id字段,所以操作是不成功的。现在做以下修改:
\app\controllers\post_controller.rb
def new
     @post = Post.new
     @post_categories=PostCategory.find(:all)
   end
即在原来默认的基础上,增加了@post_categories=PostCategory.find(:all)
然后修改页面:\app\views\post\new.rhtml
<% form_tag :action => 'create' do %>
   <%= render :partial => 'form' %>
<select name="post[category_id]">
           <% @post_categories.each do |c| %>
             <option value="<%=c.id%>"><%=c.name%></option>
           <% end %>
   </select>
   <%= submit_tag "Create" %>
<% end %>

这样,程序运行成功,可以添加文章了。
不过问题又来了,因为posts表单是默认渲染的,在添加文章的时候显示了标示文章浏览次数的字段acount.而这个字段是不要求用户输入的,我们需要在添加文章的时候隐藏这个字段,怎么办?

怎么办。。。

   发表时间:2007-10-24  
kenrome 写道
<p><strong>目标:做一个博客系统,有两张表,分类(post_categories)和文章(posts).想保持rails的scaffold,尽量减少代码编写,来完成CRUD功能。</strong></p>
<p><strong>1。数据库表:</strong></p>
<p><font color="#993300"><font color="#000000">\db\migrate\002_create_post_categories.rb</font><br />
create_table :<strong>post_categories</strong> do |t|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.column :name, :string, :null =&gt;false</font></p>
<p><font color="#993300"><font color="#000000">\db\migrate\002_create_post.rb</font><br />
create_table :<strong>posts</strong> do |t|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.column :category_id,&nbsp;&nbsp; :integer, :null =&gt;false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.column :title, :string<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.column :doc,&nbsp;&nbsp; :text<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.column :addTime,&nbsp;&nbsp; :datetime, :default =&gt;'0000-00-00 00:00:00'<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.column :isOpen, :boolean, :default =&gt;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.column :acount,&nbsp;&nbsp; :int, :default =&gt;1<br />
&nbsp;&nbsp;&nbsp;&nbsp; end<br />
&nbsp;&nbsp;&nbsp;&nbsp; execute &quot;alter table posts add constraint fk_post_category&nbsp;&nbsp; foreign key (category_id) <br />
&nbsp;&nbsp;&nbsp;&nbsp; references post_categories(id)&quot;</font></p>
<p><strong>2.用generate生成Models和Controllers</strong></p>
<p><strong>3.用generate生成views:</strong></p>
<p>generate:scaffold<br />
model name: post<br />
controller name:post<br />
actions:post</p>
<p>默认情况下,我们看到:\app\views\post\new.rhtml<br />
<font color="#993300">&lt;% form_tag :action =&gt; 'create' do %&gt;<br />
&nbsp;&nbsp; &lt;%= render :partial =&gt; 'form' %&gt;<br />
&nbsp;&nbsp; &lt;%= submit_tag &quot;Create&quot; %&gt;<br />
&lt;% end %&gt;</font></p>
<p>但因为posts外键连接了表post_categories,而以上的表单没有指定category_id字段,所以操作是不成功的。现在做以下修改:<br />
\app\controllers\post_controller.rb<br />
<font color="#993300" size="2">def new<br />
&nbsp;&nbsp;&nbsp;&nbsp; @post = Post.new<br />
&nbsp;&nbsp;&nbsp;&nbsp; @post_categories=PostCategory.find(:all)<br />
&nbsp;&nbsp; end</font><br />
即在原来默认的基础上,增加了@post_categories=PostCategory.find(:all)<br />
然后修改页面:\app\views\post\new.rhtml<br />
<font color="#993300">&lt;% form_tag :action =&gt; 'create' do %&gt;<br />
&nbsp;&nbsp; &lt;%= render :partial =&gt; 'form' %&gt;<br />
&lt;select name=&quot;post[category_id]&quot;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% @post_categories.each do |c| %&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;option value=&quot;&lt;%=c.id%&gt;&quot;&gt;&lt;%=c.name%&gt;&lt;/option&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;% end %&gt;<br />
&nbsp;&nbsp; &lt;/select&gt;<br />
&nbsp;&nbsp; &lt;%= submit_tag &quot;Create&quot; %&gt;<br />
&lt;% end %&gt;</font></p>
<p>这样,程序运行成功,可以添加文章了。<br />
不过问题又来了,因为posts表单是默认渲染的,在添加文章的时候显示了标示文章浏览次数的字段acount.而这个字段是不要求用户输入的,我们需要在添加文章的时候隐藏这个字段,怎么办?</p>
<p>怎么办。。。<br />
</p>
从视图里面把相关的ruby代码和html删掉
0 请登录后投票
   发表时间:2007-10-26  
找到了,修改views的_form.rhtml
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics