使用隐藏字段可以解决我的问题......我知道了......
大家好,
我是rails的新手,试图做一些练习。 我正在编写的应用程序正在尝试创建一个新的“帖子”。请参阅下面的视图和控制器。
但它不像我预期的那样工作...... 参数传递给函数“save”,没有“post_at”字段...
我该如何解决? 感谢
INFO: Parameters: {"authenticity_token"=>"Xc9VuvRL6GsUTaKyyNQxp8ovylEYwOMC+7hMcqdKizg=", "post"=>{"title"=>"First post", "content"=>"Write something"}, "commit"=>"save"}
查看new_post.erb
<div class="post">
<% form_for @new_post, :url => { :action => "save" } do |f| %>
<p><%= f.error_messages %></p>
<br/>
<table>
<tr>
<td>Title</td>
<td><%= f.text_field :title %></td>
</tr>
<tr>
<td>Post at</td>
<td><%= @new_post.post_at %></td>
</tr>
<tr>
<td>Message</td>
<td><%= f.text_area :content, :cols => 100, :rows => 10 %></td>
</tr>
</table>
<br/>
<%= f.submit 'save'%>
<% end %>
</div>
发布控制器
class PostController < ApplicationController
def index
@all_posts = Post.find(:all)
render :action => "post"
end
def new
@new_post = Post.new
@new_post.post_at = Time.now
render :action => "new_post"
end
def save
@new_post = params[:post]
Post.create(@new_post)
redirect_to "/post"
end
end
数据模型:
class Post
include DataMapper::Resource
storage_names[:default] = "Post"
property :id, Serial
timestamps :at
property :title, String, :required => true, :length => 500
property :content, Text, :required => true, :lazy => false
property :post_at, DateTime
end
答案 0 :(得分:1)
首先,如果您遵循REST principles。
,您的开发会更容易您的控制器应该代替save
实施create
和update
方法。
def index @posts = Post.all end def new @post = Post.new end def create @post = Post.create(params[:post]) redirect_to @post end def show @post = Post.get(params[:id]) end def edit @post = Post.get(params[:id]) end def update @post = Post.get(params[:id]) @post.update_attributes(params[:post]) redirect_to @post end def destroy @post = Post.get(params[:id]) @post.destroy redirect_to posts_path end
这是一个完整的REST控制器,index.html.erb, new.html.erb, edit.html.erb, show.html.erb
中的所有视图都有app/views/posts
。
旁注:如果您是Rails的新手,在尝试使用DataMapper之前,了解如何将其与ActiveRecord一起使用可能是个好主意。这样您就可以使用rails generate scaffold
来获得完成所有这些操作的完整示例。
答案 1 :(得分:1)
您的post_at
值不是字段,它只显示在表格中。你想这样做:
<tr>
<td>Post at</td>
<td><%= f.datetime_select :post_at %></td>
</tr>
但事实上,这个代码的错误多于此。首先,Rails已经有一个字段,它将自动设置为created_at
。接下来,您的控制器中的save
操作应该是create
操作,以遵循Rails约定。
我真的认为你应该阅读涵盖这些基本原理的Getting Started指南,然后更深入地阅读有关Rails的a book or two。这些真的教你很多。
答案 2 :(得分:0)
Ryan对问题的原因是正确的。
如果您需要一个只读字段,那么您可以添加一个隐藏字段以确保该值被回发:
<td><%= @new_post.post_at %><%= f.hidden_field :post_at %></td>
或者你可以用readonly text_field替换它:
<td><%= f.text_field :post_at, :readonly => true %></td>