我是Rails的新手,正致力于创建一个通用的" facebook"应用程序的类型作为与每个用户关联的用户和帖子的练习。但是,我目前有一个问题,我认为我用来创建帖子的表单也会被渲染为一个没有帖子ID的空白帖子,我在下面的部分中显示所有帖子。我认为这篇文章甚至在保存到数据库之前就已经显示出来了。
以下是我的观点中的代码:
<div class="newpostcontainer">
<div class="newposttext">
<%= form_for([@user, @user.posts.build]) do |f| %>
<%= f.text_area :post, size: "69x1" %>
</div>
<div class="newpostsubmitbutton">
<%= f.submit %>
</div>
<% end %>
</div>
<% @user.posts.reverse_each do |p| %>
<div class="postedcontainer">
<div class="minipostpic">
<%= image_tag @user.photo.url, width: 32, height: 32 %>
</div>
<div class="nameofposter"><%= @user.name %></div>
<div class="dateofpost"><%= p.created_at%></div>
<div class="postcontent"><%= p.id%></div> <br>
<div class="postcontent"><%= p.post%></div> <br>
<div class="likecommentdelete">
<%= link_to "Delete", [p.user, p], method: :delete %> | Like | Comment
</div>
</div>
<%end%>
</div>
这是我的控制器:
def index
@user = User.find(params[:user_id])
@posts = @user.posts.all
end
def create
@user = User.find(params[:user_id])
@post = @user.posts.create!(post_params)
redirect_to user_path(@user)
end
def show
@user = User.find(params[:user_id])
@post = @user.posts.find(params[:id])
redirect_to user_path(@user)
end
def destroy
@user = User.find(params[:user_id])
@post = @user.posts.find(params[:id])
@post.destroy
if @post.destroy
redirect_to user_path(@user)
else
redirect_to users_path
end
end
private
def post_params
params.require(:post).permit!
end
end
这是我的模特:
class Post < ActiveRecord::Base
belongs_to :user
has_many :comments
validates_presence_of :post
end
我很确定这个问题与我的表单有关,因为当我删除它或将其注释掉时,没有帖子ID的额外空白帖子就会消失。
有任何想法或建议吗?
谢谢!
答案 0 :(得分:1)
我认为您需要允许发布字段值:
即,
params.require(:post).permit!
应该是
params.require(:post).permit(:name, :post)
然后我认为只会POST。
希望有所帮助:)
答案 1 :(得分:0)
这是因为rails 4强参数功能。您需要将活动模型参数列入白名单。有关详细信息,请参阅here。
在你的情况下,你需要做这样的事情:
params.require(:post).permit(:post)
里面的“:post”是你的模型,另一个是你的textarea允许的字段。
答案 2 :(得分:0)
有几个问题 -
<强>表格强>
<%= form_for([@user, @user.posts.build]) do |f| %>
为什么要构建关联对象? @user.posts.build
不会保留您的数据,并且会导致各种非常规问题我强烈建议您在控件的posts
操作中构建new
关联对象,然后才能在视图中使用,所以你可以这样做:
#app/controllers/users_controller.rb
def new
@user = current_user
@user.posts.build
end
<%= form_for @user do |f| %>
<强>协会强>
您正尝试使用以下语句编辑post
属性:
<%= f.text_area :post, size: "69x1" %>
这在任何情况下都不起作用,因为:post
是一个关联,而不是一个对象。 Rails只允许您将 attributes
更改/添加到特定对象,这意味着您将更好地执行以下操作:
<%= f.fields_for :posts do |p| %>
<%= p.text_area :title %>
<%= p.text_area :body %>
<% end %>
强大的参数
您目前是否允许所有参数?你会做得更好:
def post_params
params.require(:user).permit(posts_attributes: [:title, :body])
end
使用帖子控制器
更好的方法是使用posts_controller
,如下所示:
#app/controllers/posts_controller.rb
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
@post.save
end
#app/views/posts/new.html.erb
<%= form_for @post do |f| %>
<%= f.text_field :title %>
<%= f.text_field :body %>
<% end %>