Ruby on rails Rails如何在保存前始终保存gsub列?

Ruby on rails Rails如何在保存前始终保存gsub列?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,在保存或更新之前,我正在尝试在我的列上创建gsub 这是我的控制器: def dansk(text) self.text.gsub('å', 'å') self.text.gsub('Å', 'Å') self.text.gsub('æ', 'æ') self.text.gsub('Æ', 'Æ') self.text.gsub('ø', '&oslas

在保存或更新之前,我正在尝试在我的列上创建gsub

这是我的控制器:

        def dansk(text)
    self.text.gsub('å', 'å')
    self.text.gsub('Å', 'Å')
    self.text.gsub('æ', 'æ')
    self.text.gsub('Æ', 'Æ')
    self.text.gsub('ø', 'ø')
    self.text.gsub('Ø', 'Ø')
    end

def update  

        @photographer = Photographer.find(params[:id])          
        @photographer.update_attributes(params[:photographer])
        @photographer.text = dansk(params[:photographer][:text])
            @photographer.text = dansk(params[:photographer][:name])


                       !@photographer.save                              
            flash[:notice] = " "
            render_action 'edit'            


    end
我做错了什么?为什么文本和名称没有被gsubbed

更新: 我的助手:

def convert_html_entities(text)
    text.gsub(/å/,"å")
    text.gsub(/æ/,"æ")
    text.gsub(/ø/,"ø")   
    text.gsub(/©/,"©")
    text = text.gsub(/["]/, '"')       
end 
你应该在模型级别这样做,如果你想保持干燥的话,可以把你的dansk方法放在一个模块中

before_save :danskify

def danskify
  self.text = dansk(self.text) if text_changed?
  self.name = dansk(self.name) if name_changed?
end

def dansk(text)
  [['å', 'å'], ['Å', 'Å'], ['æ', 'æ'], ['Æ', 'Æ'], ['ø', 'ø'], ['Ø', 'Ø']].each do |rule|
    text = text.gsub(rule[0], rule[1])
  end
end
在控制器中,您只需要:

def update  
  @photographer = Photographer.find(params[:id])          
  @photographer.update_attributes(params[:photographer])
  flash[:notice] = " " #weird message BTW
  render :edit  
end
你应该在模型级别这样做,如果你想保持干燥的话,可以把你的dansk方法放在一个模块中

before_save :danskify

def danskify
  self.text = dansk(self.text) if text_changed?
  self.name = dansk(self.name) if name_changed?
end

def dansk(text)
  [['å', 'å'], ['Å', 'Å'], ['æ', 'æ'], ['Æ', 'Æ'], ['ø', 'ø'], ['Ø', 'Ø']].each do |rule|
    text = text.gsub(rule[0], rule[1])
  end
end
在控制器中,您只需要:

def update  
  @photographer = Photographer.find(params[:id])          
  @photographer.update_attributes(params[:photographer])
  flash[:notice] = " " #weird message BTW
  render :edit  
end

忽略代码中的其他奇怪问题,您需要gsub!方法注意感叹号。gsub!原地修改字符串,而gsub no感叹号返回一个新的字符串对象。

忽略代码中的其他奇怪问题,您需要gsub!方法注意感叹号。gsub!原地修改字符串,而gsub no感叹号返回一个新的字符串对象。

无意冒犯,但您的代码没有任何意义。控制器中是否有“def dansk”。有很多问题

如何让它工作

在丹麦,它应该是text.gsub而不是self.text.gsub。该上下文中的self是对控制器本身的引用。 多次调用text.gsub并不能满足您的需要。gsub返回一个新字符串,替换了有问题的字符,保留原始字符串不变。因此,您基本上丢失了所有这些更改,因为您只返回最后一个。应该是这样的

def dansk(text)
  text.gsub('å', 'å').gsub('Å', 'Å')...
end
或者这个gsub!将其更改应用于原始字符串

def dansk(text)
  text.gsub!('å', 'å')
  text.gsub!('Å', 'Å')
  ...
  text
end
最好的办法

这样,每次你对摄影师对象调用“保存”时,你不想要的角色都会自动被替换

model Photographer
  ...
  before_validation :dansk!
  ...

  private

  def dansk!
    self.text.gsub!('å', 'å')
    self.text.gsub!('Å', 'Å')
    ...
  end
end

@photographer = Photographer.find(params[:id])          
@photographer.update_attributes(params[:photographer])
@photographer.save

无意冒犯,但你的代码毫无意义。控制器中是否有“def dansk”。有很多问题

如何让它工作

在丹麦,它应该是text.gsub而不是self.text.gsub。该上下文中的self是对控制器本身的引用。 多次调用text.gsub并不能满足您的需要。gsub返回一个新字符串,替换了有问题的字符,保留原始字符串不变。因此,您基本上丢失了所有这些更改,因为您只返回最后一个。应该是这样的

def dansk(text)
  text.gsub('å', 'å').gsub('Å', 'Å')...
end
或者这个gsub!将其更改应用于原始字符串

def dansk(text)
  text.gsub!('å', 'å')
  text.gsub!('Å', 'Å')
  ...
  text
end
最好的办法

这样,每次你对摄影师对象调用“保存”时,你不想要的角色都会自动被替换

model Photographer
  ...
  before_validation :dansk!
  ...

  private

  def dansk!
    self.text.gsub!('å', 'å')
    self.text.gsub!('Å', 'Å')
    ...
  end
end

@photographer = Photographer.find(params[:id])          
@photographer.update_attributes(params[:photographer])
@photographer.save

我可以在模型或控制器中使用应用程序帮助程序吗?如果我是你,我会创建一个包含dansk方法的单独模块,然后将其包含在你的应用程序帮助程序和适当的模型中。保存模型后,它会将所有文本替换为[[å,å],[å,å],[æ,æ],[Æ,Æ],[Ø]]哇。。。不明白,更改danks方法,因为我刚刚编辑为see,我更改了dansk,它现在正在工作。唯一的问题是,当呈现编辑表单时,名称不是html转义的。我已尝试将以下内容添加到我的编辑操作:@scapector.name=raw@photographer.name但是得到错误:未定义的方法'raw'用于。。。我正在使用simple_form_for..我可以在模型或控制器中使用应用程序帮助程序吗?如果我是你,我会创建一个包含dansk方法的单独模块,然后将其包含在应用程序帮助程序和适当的模型中。保存模型时,它会将所有文本替换为[[å,å],[æ,æ],[Æ,Æ],[ø,ø]哇,哇。。。不明白,更改danks方法,因为我刚刚编辑为see,我更改了dansk,它现在正在工作。唯一的问题是,当呈现编辑表单时,名称不是html转义的。我已尝试将以下内容添加到我的编辑操作:@scapector.name=raw@photographer.name但是得到错误:未定义的方法'raw'用于。。。我使用的是简单的表格。我删除了以前的评论。这是可行的,但只是undry的名称也应该改变,而不是优化。顺便说一句,在更新æu属性后不需要保存。当我编写示例时,模型不想保存,因为我删除了以前的注释。这是可行的,但只是undry的名称也应该改变,而不是优化。顺便说一句,更新æu属性后不需要保存。当我编写示例letteæåø时,模型不想保存