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



我正在写一篇简单的关于Rails 5的评论博客文章来自学。这是一个电子游戏评论网站,用户可以在这里评论他们最近玩过的游戏。用户还可以在评论中添加评论。

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

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部分呈现错误消息说:"1个错误禁止保存:评论无效"。

我猜关于评审表单或参数哈希中的数据的某些内容没有被传输。我不知道为什么。我甚至尝试用内置的Rails帮助器构建关联:accepts_nested_attributes_for,我仍然得到相同的错误。

这里是链接到我的回购完全清晰:https://github.com/jchu4483/Rails-Assessment-

谢谢,任何帮助或建议都很感激。

看起来像是game_params中的reviews_attributes中的属性与表单上的属性不匹配。Game_params列出评级、内容、user_id。表格中有标题,内容,分数。

现在我认为问题可能是因为嵌套的形式与has_manythrough关联。您的Review没有通过验证,因为它也连接到User模型。你的Review模型应该有accepts_nested_attributes_for User

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

最新更新