我正在写一篇简单的关于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_many
和through
关联。您的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