我正在开发一个Rails应用程序,我有几个动作(#delete_later,#ban_later等),其中我只从请求参数设置一个属性(具体来说,是reason执行该操作的字段).
我想知道是否可以这样做:
def ban_later
@object.reason = params[:object][:reason]
@object.save
end
Run Code Online (Sandbox Code Playgroud)
或者即使在这种情况下使用强对数也是最佳做法?
def ban_later
@object.reason = object_params[:reason]
@object.save
end
private
def object_params
params.require(:object).permit(:permitted_1, :permitted_2, :reason)
end
Run Code Online (Sandbox Code Playgroud)
哪种解决方案最好?如果没有,那么问题的最佳解决方案是什么?
后来编辑:
#ban_later,#delete_later动作确实可以设置一个标志列,status但是可以在不从params散列中接收它的值的情况下完成.由于您只为每个方法设置一个状态,因此当您在#delete_later时可以设置状态"pending_delete",当您在#ban_later时,可以设置"pending_ban"状态.
稍后编辑
为什么使用#save而不是update_attributes直接?假设您需要if @object.save发表声明.在false分支(对象未保存)上,您可能仍希望呈现使用其内容的视图@object.
如果我们在集合上有一个方法,该方法采用一个块,而在每个元素上执行了另一个方法,则可以使用&符号将其写得更短。例如:如果我们有一个整数数组,并且想要删除奇数,我们可以这样做:
[1,2,3,4,5,6,7,8].reject {|x| x.odd?}
Run Code Online (Sandbox Code Playgroud)
使用与号,我们可以这样写:
[1,2,3,4,5,6,7,8].reject(&:odd?)
Run Code Online (Sandbox Code Playgroud)
假设我们有一个字符串数组,并且想要删除包含的元素'a'。我们可以这样编写解决方案:
['abc','cba','cbc','cdc','dca','cad','dc','cc].reject {|x| x.include? 'a'}
Run Code Online (Sandbox Code Playgroud)
我们如何使用与号语法编写此代码(如果可能)?