【问题标题】:Rails 4. Attribute not saving when creating modelRails 4. 创建模型时属性不保存
【发布时间】:2016-01-13 17:13:30
【问题描述】:

我很困惑为什么这不起作用。我有一个评论系统,以及一个创建新评论的链接,通过 2 个属性; user_id 和 gigid。两个 id 都生成为整数,但是当我保存评论时,gigid 保存为“nil”而不是整数。

查看:

<%= link_to 'Click here to rate this user', new_user_review_path(:user_id => request.user.id, :gigid => request.gig.id) %>

这里两个 ID 都设置正确(根据服务器输出)。 User_id 是要审核的用户(正常工作),gigid 是后期验证的参考。 (在我尝试保存之前正常工作)

_form :

<%= simple_form_for([@user, @user.reviews.build]) do |f| %>
<div id="rating-form">
<label>Rating</label>
</div>
<%= f.input :comment %>
<%= f.button :submit %>

<% end %>

控制器:

def new
    if user_signed_in?
    @review = current_user.reviews.new
  else
    redirect_to(root_url)
    flash[:danger] = "You must log in to rate a user"
  end
  end

def create
    @review = @user.reviews.new review_params
    @review.reviewed_id = current_user.id
       if @review.save
      redirect_to user_path(@user)
    else
      render 'new'
    end
  end

private

    def review_params
      params.require(:review).permit(:rating, :comment, :gigid, :user_id)
    end
end

点击链接时的服务器输出:

Started GET "/users/21/reviews/new?gigid=17&locale=en" for 127.0.0.1 at 2016-01-13 18:08:26 +0100
Processing by ReviewsController#new as HTML
  Parameters: {"gigid"=>"17", "locale"=>"en", "user_id"=>"21"}
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 21]]
  User Load (0.2ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
  Rendered reviews/_form.html.erb (4.9ms)

然后我添加评论和评级并单击创建。 单击创建时的服务器输出:

Started POST "/users/21/reviews?locale=en" for 127.0.0.1 at 2016-01-13 18:10:44 +0100
Processing by ReviewsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"RToZwvodvXxQp1/spEhgemO/oi+4rof8jREuLw27CcEsEBqFWGLeYne1CgH3kvWu9OzAV+bHvOk9g9nq8JMPnw==", "review"=>{"rating"=>"5", "comment"=>"sdfsdfdd"}, "commit"=>"Create Review", "locale"=>"en", "user_id"=>"21"}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 21]]
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
   (0.1ms)  begin transaction
  SQL (0.7ms)  INSERT INTO "reviews" ("rating", "comment", "user_id", "reviewed_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?, ?)  [["rating", 5], ["comment", "sdfsdfdd"], ["user_id", 21], ["reviewed_id", 1], ["created_at", "2016-01-13 17:10:44.675386"], ["updated_at", "2016-01-13 17:10:44.675386"]]
   (93.6ms)  commit transaction

我注意到“gigid”在这里被完全忽略了,但其他一切都很好。 我不明白为什么一个属性保存而另一个不保存,任何见解将不胜感激!

【问题讨论】:

  • 可以发一下表格代码吗?
  • 我使用的是 link_to 而不是表单。引用代码的第一位是我正在使用的代码。
  • #new 操作代码在哪里?
  • 我的意思是你用来将属性值发布到数据库的表单。
  • 发布您的_form.html.erb 代码。

标签: ruby-on-rails model attributes


【解决方案1】:

您的表单没有任何内容供gigid 将其发送到create 操作。您可以使用如下形式的隐藏字段

<%= simple_form_for([@user, @user.reviews.build]) do |f| %>
  <div id="rating-form">
    <label>Rating</label>
  </div>
  <%= f.input :comment %>
  <%= f.input :gigid, :as => :hidden, :input_html => { :value => params[:gigid] }
  <%= f.button :submit %>
<% end %>

【讨论】:

  • 我已经尝试过了,得到:#<:request:0x007f540b2bafa0> 的未定义方法 `gig'。 :gigid => request.gig.id 没有传递给创建表单
  • 如果我手动输入一个数字,那么这确实有效并且 gigid 可以正确保存,但我无法将 request.gig.id 传递给表单。我认为我无法从该表单中检索到特定的 gig.id。
  • 添加 params[:gigid] 作为@kimrgrey 指出的值已经为我解决了这个问题。最后,我的隐藏字段显示为 ' :hidden, :input_html => { :value => params[:gigid] } %> '
【解决方案2】:

评论参数中没有gigid。执行 POST 时仔细查看参数:"review"=&gt;{"rating"=&gt;"5", "comment"=&gt;"sdfsdfdd"}。只需审查和评论。之后你正在做:

params.require(:review).permit(:rating, :comment, :gigid, :user_id)

【讨论】:

  • 这就是我感到困惑的地方。我以相同的方式设置了 user_id 和 gigid,但只保存了 user_id。在我的表单上,我没有任何输入,因为它们需要在创建时设置
  • 不一样。您有一个为@user 对象创建的表单,但您没有在此表单中添加有关gigid 的信息。只需添加隐藏字段,一切都会奏效。
  • 谢谢,在隐藏字段中手动输入数字可以保存 gigid,但我需要一种方法将前一页的 gig ID 发送到表单中。
  • 当您在 /new 上执行获取请求时,您在 params 中有来自上一页的 gigid。只需使用来自params[:gigid] 的值作为隐藏字段的值。
  • 是的,是的,就是这样。我不确定如何将该值传递给表单。 :hidden, :input_html => { :value => params[:gigid] } %> 对我有用。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多