【问题标题】:Rails update action not updatingRails 更新操作未更新
【发布时间】:2016-09-16 21:00:09
【问题描述】:

尝试更新帖子的匿名性:

在视图中

<%= form_for (post), remote: true do |f| %>
                            <%= f.check_box :anonymous %>
                            <span>Anonymous</span>
                            <%= f.submit 'Save' %>
                        <% end %>

控制器

def update
@post = Post.find(params[:id])
if @post.update_attributes(permit_post)
  puts 'aaaaaaaaaaaaaaa'
  puts @post.anonymous === true
  puts 'aaaaaaaaaaaaaaa'
  respond_to do |format|
   format.html
   format.js
  end
end
end
private 
def permit_post
params.require(:post).permit(:image, :title, :long, :anonymous, :facenumber);
end

在控制台中

    Started PATCH "/posts/9" for 94.187.88.109 at 2016-09-16 20:58:09 +0000
Processing by PostsController#update as JS
  Parameters: {"utf8"=>"✓", "post"=>{"anonymous"=>"1"}, "commit"=>"Save", "id"=>"9"}
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 2]]
  Post Load (0.2ms)  SELECT  "posts".* FROM "posts" WHERE "posts"."id" = ?  ORDER BY created_at DESC LIMIT 1  [["id", 9]]
   (0.2ms)  begin transaction
   (0.1ms)  rollback transaction
   (0.1ms)  begin transaction
   (0.1ms)  rollback transaction
  Rendered posts/update.js.erb (0.1ms)
Completed 200 OK in 150ms (Views: 22.4ms | ActiveRecord: 0.9ms)

似乎没有错误,但属性没有更新。 谢谢您的帮助 更新 在模型中

class Post < ActiveRecord::Base
include PublicActivity::Common
cattr_accessor :current_user
cattr_accessor :user_id
acts_as_votable
has_attached_file :image, styles: { medium: "550", large: "600", thumb: "100x100>" }, default_url: "/missing.png"
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
belongs_to :user
belongs_to :category
validates :user_id, presence: true
validates :image, presence: true
has_many :comments

结束

【问题讨论】:

  • permit_post 中有什么内容?
  • @RSB 更新了问题

标签: ruby-on-rails forms ruby-on-rails-4


【解决方案1】:

在我看来,验证没有通过。正如您在控制台中看到的,没有您放置、打印的 puts 评估。这意味着update_attributes 正在返回false

您为什么不使用byebug 放置断点并评估@post.errors.messages.inspect,以检查它为什么不更新?如果您不想将 byebug 包含到您的开发 gem 中,另一个选项是 Rails.logger.info(@post.errors.messages.inspect)。当然,这需要放在@post.update_attributes 之后(if 结束的地方)

【讨论】:

    【解决方案2】:

    您在 01 中获得布尔值,但 ruby 理解 truefalse。所以你需要在保存之前将1 转换为true0 为false。您可以像这样在Post 模型中这样做

    before_validation :convert_boolean
    
    def convert_boolean
      self.anonymous = (anonymous != nil and anonymous != '0')      
    end
    

    为避免这种情况,您也可以在参数中传递true/false 而不是0/1

    试试这个

    <%= f.check_box :anonymous, {}, true, false %>
    

    希望有帮助!

    【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多