将post_user_name列添加到post表后,无法保存用户名

时间:2014-08-21 06:14:22

标签: ruby-on-rails ruby ruby-on-rails-4 devise

我有一个铁路练习项目,如博客网站用户通过rails 4设计gem。 它之前工作得很好。我在评论中已经有user_name,它运行正常。但是当我通过post_user_name添加colomn FixColumnName时 它只是无法保存用户名,并且无法在帖子和评论中显示它们!怎么会这样? (我在帖子表格中有post_user_name,在评论表格中有user_name。它们没有关联,但都使用设计current_user.username。)

我的帖子索引erb:

<h1>Listing posts</h1>
<% if user_signed_in? %>
     <div class="field">
     <%= link_to 'Create a New Post', new_post_path, :class => "btn btn-success btn-sm" %>
     </div>
  <% end %>

<% @posts.each do |post| %>
<div class="post thumbnail">
  <h3><%= post.name %></h3>
  <div><h5>edit by <%= post.post_user_name %></h5></div>
  <div><%= (post.descriptopm).html_safe %></div>

  <% if user_signed_in? %>
  <div class="bottom-bottoms">
    <%= link_to 'Display', post, :class => "btn btn-info btn-xs" %>
    <%= link_to 'Edit', edit_post_path(post), :class => "btn btn-info btn-xs" %>
    <%= link_to 'Delete', post, method: :delete, data: { confirm: 'Are you sure?' }, :class => "btn btn-info btn-xs" %>
  </div>
  <% end %>

  <h3>Comments</h3>
  <% post.comments.each do |comment| %>
    <div>
      <p><strong><%= comment.user_name %></strong> : <%= (comment.body).html_safe %></p>
    </div>
  <% end %>

  <%= bootstrap_form_for(@comment) do |f| %>
  <% if @comment.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>

      <ul>
      <% @comment.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <% if user_signed_in? %>
  <div class="field">
  <%= f.text_field :user_name, value: current_user.username, :disabled => true %>
  </div>
  <div class="field">
  <%= f.text_area :body %>
  </div>
  <%= f.hidden_field :post_id, value: post.id %>
  <div class="actions">
  <%= f.submit %>
  </div>
  <% end %>

<% end %>

</div>
<% end %>

后期文本字段:

<div class="field">
  <%= f.text_field :post_user_name, value: current_user.username, :disabled => true, label: "Your Name" %>
</div>

我的帖子控制器

def post_params
  params.require(:post).permit(:name, :post_user_name, :descriptopm)
end

我的评论控制器

def comment_params
  params.require(:comment).permit(:user_name, :body, :post_id)
end

2 个答案:

答案 0 :(得分:2)

取下表格中的:disabled => true,它有效!! 但我真的不知道为什么? QQ

答案 1 :(得分:0)

为了给你更多信息,让我给你一些想法......

-

<强>协会

当你提到你正在为user_namePost模型的每个调用Comment属性时,这让我很畏缩。

原因是,如果你这样做,你就完全违背了DRY (Don't Repeat Yourself)&amp; Single Source Of Truth软件开发原则 - 这意味着您需要对整个应用程序中的方法/函数和数据保持单一引用

当您使用post.post_user_name表格中的某个属性致电posts时,您需要为自己设置麻烦:

-

Foreign Keys

您应该专注于在表中使用foreign_keys而不是填充user_name列,而是允许您引用关联表中的对象。这是ActiveRecord associations进来的地方:

#app/models/user.rb
Class User < ActiveRecord::Base
   has_many :posts
   has_many :comments
end

#app/models/post.rb
Class Post < ActiveRecord::Base
   belongs_to :user
   delegate :name, to: :user, prefix: true #-> @post.user_name

   #fields id | user_id | title | content | created_at | updated_at 
end

#app/models/comment.rb
Class Comment < ActiveRecord::Base
   belongs_to :user
   delegate :name, to: :user, prefix: true #-> @comment.user_name

   #fields id | user_id | title | content | created_at | updated_at 
end

如您所见,如果您填充foreign_key(在我们的案例中为user_id),它将使我们能够从其他数据表中引用相应的对象。这意味着,而不是访问@post对象&#34;用户名&#34;直接地,如果您已正确关联它,您就可以像username这样引用@post.user_nameforeign_key

-

<强>设置

让这个设置工作的诀窍是简单地设置#app/controllers/posts_controller.rb Class PostsController < ApplicationController def create current_user.posts.create(post_params) ... end end ,使用对象或值:

{{1}}

这将根据需要为您设置所有关联