表格导致空白帖子没有ID

时间:2014-05-01 05:02:01

标签: ruby-on-rails

我是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的额外空白帖子就会消失。

有任何想法或建议吗?

谢谢!

3 个答案:

答案 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 %>