如何将用户与新闻相关联?

时间:2019-07-12 05:33:14

标签: ruby-on-rails

我想将每个新闻与某个特定用户相关联。 我已将评论链接到特定新闻,但这不起作用

_form.html.erb

<%= form_for([@user , @user.newss.build]) do |form| %>
  <%# if news.errors.any? %>
    <div id="error_explanation">
      <h2><%#= pluralize(news.errors.count, "error") %> prohibited this 
news from being saved:</h2>

      <ul>
      <%# news.errors.full_messages.each do |message| %>
        <li><%#= message %></li>
      <%# end %>
      </ul>
    </div>
   <%# end %>

  <div class="field">
    <%= form.label :title %>
    <%= form.text_field :title %>
  </div>

  <div class="field">
    <%= form.label :description %>
    <%= form.text_area :description %>
  </div>

  <div class="actions">
    <%= form.submit %>
  </div>
<% end %>

我的user.rb

class User < ApplicationRecord
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable, :trackable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  has_many :news
end
#my news.rb
class News < ApplicationRecord
    has_many :comments
    belongs_to :user
end

它显示了不同类型的错误,我不明白...

2 个答案:

答案 0 :(得分:0)

Ruby on rails在配置上遵循约定,这意味着您只需要遵循正确的约定即可获得正确的结果。

例如:

这里新闻属于用户,用户有很多新闻 因此要获取特定用户的新闻,您将执行 user.news ;对于新闻,您将进行 news.user

这里我们使用新闻的复数形式,而用户使用单数形式

因此,在您的代码中,您只是为表单犯了一个约定错误。

只需从以下代码中的新闻中删除多余的“ s”即可。

<%= form_for([@user , @user.newss.build]) do |form| %>

这必须是:

<%= form_for([@user , @user.news.build]) do |form| %>

答案 1 :(得分:0)

如果您有用户登录并且新闻控制器启动新闻对象并创建如下对象,我建议在控制器级别执行此操作,

class NewsController < ApplicationController

  def new
   @news = News.new #place this inside your form 
  end

  def create
   @news = current_user.news.create permit_params
   if @news.errors.blank?
    # Redirect or concerned logic here
   else
    # Rerender errors to the form
   end
  end

  private
  def permit_params
     params.require(:news).permit(:title, :description)
  end
end

这将确保仅将新闻绑定到创建新闻的用户,否则新闻将传递user_id,这是一个公开的漏洞。希望这会有所帮助:)