嵌套表单中的自定义属性设置器方法

时间:2016-09-22 00:21:59

标签: ruby-on-rails ruby nested-forms

我在Rails 5上构建一个简单的Reviewer博客文章,以便自学。它是一个视频游戏评论家,用户可以在其中撰写关于他们最近玩过的游戏的评论。用户还可以向评论添加评论。

我想通过嵌套表单在我的Game模型上实现自定义属性writer。当用户第一次列出游戏时,我也希望他们能够当场为该游戏撰写评论。

Game.rb

class Game < ApplicationRecord
  has_many :reviews, dependent: :destroy
  has_many :users, through: :reviews

  validates :title, presence: true

  def reviews_attributes=(reviews_attributes)
    reviews_attributes.values.each do |review_attributes|
      self.reviews.build(review_attributes)
    end
  end
end

游戏/ new.html.erb

<h1>Enter a new Game</h1>

<%= form_for @game do |f| %>
  <%= render 'shared/error_messages', object: @game %>
  <%= render 'new_form', f: f %>
  <br><br>
  Review:
  <br>
  <%= f.fields_for :reviews, @game.reviews.build do |r| %>
  <%= render 'reviews/form', f: r %>

  <%= f.submit "Add Game and/or Review!" %>
  <% end %>
<% end %>

评论/表单部分

  <%= f.label :title %>
  <%= f.text_field :title %>

  <br>
  <%= f.label :content %>
  <%= f.text_area :content %>

  <br>
  <%= f.label :score %>
  <%= f.text_field :score %>

  <%= f.hidden_field :user_id, :value => current_user.id %>

Games_Controller.rb

  def create
    @game = Game.new(game_params)
    if @game.save
      redirect_to @game
    else
      render :new
    end
  end

  private
    def game_params
      params.require(:game).permit(:title, :platform, reviews_attributes: [:rating, :content, :user_id])
    end

出于某种原因,每当我尝试通过嵌套表单创建与游戏相关联的新评论时,我都会一直无法获得评论。我的error_messages部分正在呈现错误消息:&#34; 1错误禁止保存:评论无效&#34;。

关于查询表单或params哈希中的数据的某些内容我不会被传输。我不知道为什么。我甚至尝试使用内置的Rails助手来构建关联: accepts_nested_attributes_for ,我仍然得到同样的错误。

以下是我的回购链接的完整清晰度链接:https://github.com/jchu4483/Rails-Assessment-

谢谢,任何帮助或建议表示赞赏。

2 个答案:

答案 0 :(得分:1)

看起来game_params中的reviews_attrbitues中的属性与表单上的属性不匹配。 Game_params列出评级,内容,user_id。在表单中,您有标题,内容,分数。

答案 1 :(得分:0)

现在我认为问题可能是由于具有has_manythrough关联的嵌套表单。您的评论未通过验证,因为它也已加入用户模型。您的评论模型应该有accepts_nested_attributes_for用户

class Review < ApplicationRecord
  belongs_to :user
  belongs_to :game

  accepts_nested_attributes_for :user
end

您的表单应该还有另一个fields_for用户

<%= form_for @game do |f| %>
   <%= f.fields_for :reviews do |r| %>
      <%= r.fields_for :users do |u| %>
         ...
      <% end %>
   <% end %>
   <%= f.submit %>
<% end %>

并且在game_params的控制器中,您还需要为users_attributes传递数组

def game_params
  params.require(:game).permit(:title, :platform, reviews_attributes: [:id, :rating, :content, :user_id, user_attributes: [...])
end

这个问题的答案可能会有所帮助:https://stackoverflow.com/a/21983998/5531936