我在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-
谢谢,任何帮助或建议表示赞赏。
答案 0 :(得分:1)
看起来game_params中的reviews_attrbitues中的属性与表单上的属性不匹配。 Game_params列出评级,内容,user_id。在表单中,您有标题,内容,分数。
答案 1 :(得分:0)
现在我认为问题可能是由于具有has_many
和through
关联的嵌套表单。您的评论未通过验证,因为它也已加入用户模型。您的评论模型应该有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