以rails形式将一个模型属性替换为另一个模型属

时间:2014-05-23 02:02:26

标签: ruby-on-rails forms attributes

我正在使用Rails构建一个非常简单的电影评论应用程序,它没有任何身份验证系统。

该应用有:

  • 用户模型(ID,名称,电子邮件),其中包含许多评论并且有许多评论
  • 评论模型(ID,标题,图片,内容),属于一个用户并且有很多评论
  • 评论模型(id,content),属于一个用户,属于一个评论

以下是评论的_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方法修改审阅模型,但它没有解决问题,实际上在应用程序中创建了一些其他错误。

我该如何解决这个问题?

2 个答案:

答案 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属性和填充它们

form_for

  

通常,用于创建或更新资源的表单反映了   资源的身份有几种方式:(i)表单的URL   发送到(表单元素的action属性)应该导致a   请求被路由到适当的控制器操作(使用   适当:在现有资源的情况下为id参数),(ii)   输入字段应以控制器中的方式命名   它们的值出现在params散列中的适当位置,   (iii)对于现有记录,最初是表格   显示,输入与资源属性对应的字段   应该显示这些属性的当前值。

-

您正在填充Comment模型对象 - 这将在您的数据库中定义属性,例如bodytitle

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

-

Nested Route

很多更好的方法是使用嵌套路线,这样你就可以从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