我今天一直在尝试Ruby+Rails。
在创建了标准的User
和Micropost
模型、视图和控制器之后,我想添加一个页面,作为用户,可以在其中添加一个新的微柱。
到目前为止,由于真的没有进行身份验证,我很乐意有一个页面,可以通过url获取用户id,唯一的形式是有一个文本框,可以在其中键入要添加到网站的微帖子。
我已经接通了所需的路由:
match 'users/new_micropost/:user_id' => 'Users#new_micropost'
以及控制器的代码:
def new_micropost
@user = User.find(params[:user_id])
@micropost = Micropost.new #still not so sure about this
end
我已经将粘贴的microposts/new.html.erb
文件复制到一个名为users/new_micropost.html.erb
:的新文件中
<h1>New <%= @user.name %>'s micropost</h1> #added this thingy
<%= render 'form' %>
<%= link_to 'Back', users_path %>
取代<%= render 'form' %>
的惯用方式,只打印一个文本框询问我想在网站上发布的微帖子加上提交按钮,最好的方法是什么?
感谢
对于表单,只需创建自己的表单,传入@micropost
变量,类似于:
<%= form_for @micropost do |f| %>
<%= f.text_area :body, :size => "60x12" %>
<%= f.submit "Post" %>
<% end %>
查看这些指南以了解更多信息。您可能需要在控制器中为此操作创建一个单独的create
操作。
此外,如果你想将微柱与用户关联,你需要添加以下内容:
class User < ActiveRecord::Base
has_many :microposts, :dependent => :destroy
end
class Micropost < ActiveRecord::Base
belongs_to :user
end
然后你会改变你的新动作并创建类似的动作:
def new_micropost
@user = User.find(params[:user_id])
@micropost = @user.microposts.build
end
def create_micropost
@user = User.find(params[:user_id])
@micropost = @user.microposts.build(params[:micropost])
if @micropost.save
redirect_to some_path
else
render 'new_micropost'
end
end
单击此处阅读有关关联的更多信息。
请注意,您可能需要更新表单才能提交给正确的控制器:<%= form_for @micropost, url: create_micropost_path(@user.id) do |f| %>
在Rails中,控制器有7个标准动作,与创建、读取、更新和删除资源有关。如果你把你的动作命名为MicropostsController的new
,那就太好了。您可以使用form_for
标记创建一个文本区域和一对用于提交和取消的按钮。示例:
<%= form_for @micropost do |f| %>
<%= f.label :content %>
<%= f.text_area :content %>
<%= f.submit %>
<% end %>
但在运动中学习最简单的方法是使用Rails生成器,比如:
rails generate scaffold Micropost content:text