我正在使用Rails构建一个非常简单的电影评论应用程序,它没有任何身份验证系统。
该应用有:
以下是评论的_form.html.erb文件:
<%= bootstrap_form_for(@comment) do |f| %>
<% if @comment.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@comment.errors.count, "error") %> prohibited this comment from being saved:</h2>
<ul>
<% @comment.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.text_field :content %>
</div>
<div class="field">
<%= f.number_field :review_id %>
</div>
<div class="field">
<%= f.number_field :user_id %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
添加/编辑评论时,用户可以选择评论将归因于的评论,这要归功于:
<div class="field">
<%= f.number_field :review_id %>
</div>
让他在评论ID之间进行选择。
相反,我希望用户能够选择他想评论的评论的评论标题。
我尝试使用to_param方法修改审阅模型,但它没有解决问题,实际上在应用程序中创建了一些其他错误。
我该如何解决这个问题?
答案 0 :(得分:2)
不确定我是否关注,但您可以在这里使用选择标记吗?
这假设您在控制器中定义了一个名为@reviews的实例变量,该变量可用。 在这种情况下,@ review可能类似于Review.all
select_tag "review", options_from_collection_for_select(@reviews, "id", "title"), prompt: "Select a review"
答案 1 :(得分:2)
除了ply
的答案之外,您必须记住的是,当您填充基于对象的表单时,您真的需要Model
&#39; s属性和填充它们
通常,用于创建或更新资源的表单反映了 资源的身份有几种方式:(i)表单的URL 发送到(表单元素的action属性)应该导致a 请求被路由到适当的控制器操作(使用 适当:在现有资源的情况下为id参数),(ii) 输入字段应以控制器中的方式命名 它们的值出现在params散列中的适当位置, (iii)对于现有记录,最初是表格 显示,输入与资源属性对应的字段 应该显示这些属性的当前值。
-
您正在填充Comment
模型对象 - 这将在您的数据库中定义属性,例如body
,title
等
Comment
模型中的一个属性是review_id
foreign_key
对于Comment
模型, review_id
如何传递给它并不重要;只是它已经完成了。这就是为什么使用text_field
直接输入ID,或者使用select
标记来帮助用户选择他们想要的项目无关紧要的原因
-
<强> collection_select 强>
<%= f.collection_select(:review_id, Review.all,
:id, :title,
{:prompt => 'Please select the review of this comment'}) %>
这将为您提供一个选择框,您可以在其中选择review
-
很多更好的方法是使用嵌套路线,这样你就可以从parmas中设置review_id
:
#config/routes.rb
resources :reviews do
resources :comments #-> /reviews/1/comments/new
end
#app/controllers/comments_controller.rb
def create
@comment = Comment.new(comment_params)
@comment.save
end
private
def comment_params
params.require(:comment).permit(:content).merge(review_id: params[:review_id])
end