我们知道 laravel 有一个 update() 方法可以通过“put”http 方法更新记录。一切都很顺利,除非我尝试根据我的用户模型中的静态 $rules 方法验证新输入值。 请看看我的模型
protected $guarded = ['id', 'admin'];
public static $rules = [
'name' => 'required|min:4',
'username' => 'required|min:3|alpha_num|unique:users',
'email' => 'required|email|unique:users',
'password' => 'required|alpha_num|between:5,12|confirmed',
'password_confirmation' => 'required|alpha_num|between:5,12',
'phone' => 'required|min:5|alpha_num',
'city' => 'required|min:2|alpha',
'town' => 'required|min:2|alpha_num',
'address' => 'required|min:5|alpha_num',
'blood' => 'required|min:2',
'img' => 'image|mimes:jpeg,jpg,bmp,png,gif',
'active' => 'integer',
'admin' => 'integer'
];
你看,我已将电子邮件作为用户表的唯一信息。因此,当我尝试更新有关登录用户个人资料信息的记录时,如果我更新所有记录以及电子邮件地址,它就会起作用。但是,如果我按原样保留电子邮件字段,它会抛出验证错误,指出电子邮件地址已被使用。 但我希望 laravel 仅验证更新的字段,以便用户可以更新他们想要的任何内容或像以前一样保留一两个。 有什么办法可以实现吗?
现在请检查负责更新新输入数据的 Controller 方法
//update the changes now
public function update($id) {
$user = User::find($id);
$validator = Validator::make(Input::all(), User::$rules);
$input = array_except(Input::all(), ['_method', 'password_confirmation']);
if( $validator->passes() ) {
$user->save($input);
return Redirect::to('donors/'.$user->username.'/profile')
->withMessage('Information Updated');
}
return Redirect::to('donors/'.$user->username.'/profile/edit')
->withMessage('Something went wrong! Please fix the errors.')
->withErrors($validator)
->withInput();
}
为了更清楚地理解场景,我还添加了 View 中的表单和路由文件片段。
路线
Route::put('donors/{id}', ['uses'=>'DonorsController@update']);
View 表单
{{ Form::open(['url'=>'donors/'.$donor->id, 'method'=>'put', 'role'=>'form']) }}
<table class="table table-bordered donors-table">
<colgroup>
<col class="col-xs-1">
<col class="col-xs-7">
</colgroup>
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>
<span class="text-green">Name</span>
</td>
<td>
{{ Form::text('name', $donor->name) }}
<span class="text-red input-error">{{ $errors->first('name') }}</span>
</td>
</tr>
<tr>
<tr>
<td>
<span class="text-green">Email</span>
</td>
<td>
{{ Form::email('email', $donor->email) }}
<span class="text-red input-error">{{ $errors->first('email') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">New Password</span>
</td>
<td>
{{ Form::password('password', null) }}
<span class="text-red input-error">{{ $errors->first('password') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Confirm New Password</span>
</td>
<td>
{{ Form::password('password_confirmation', null) }}
<span class="text-red input-error">{{ $errors->first('password_confirmation') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Blood Group</span>
</td>
<td>
{{ Form::text('blood', $donor->blood) }}
<span class="text-red input-error">{{ $errors->first('blood') }}</span>
</td>
</tr>
<tr>
<tr class="odd">
<td>
<span class="text-green">Address</span>
</td>
<td>
{{ Form::text('address', $donor->address) }}
<span class="text-red input-error">{{ $errors->first('address') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">City</span>
</td>
<td>
{{ Form::text('city', $donor->city) }}
<span class="text-red input-error">{{ $errors->first('city') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Town</span>
</td>
<td>
{{ Form::text('town', $donor->town) }}
<span class="text-red input-error">{{ $errors->first('town') }}</span>
</td>
</tr>
<tr class="odd">
<td>
<span class="text-green">Phone</span>
</td>
<td>
{{ Form::text('phone', $donor->phone) }}
<span class="text-red input-error">{{ $errors->first('phone') }}</span>
</td>
</tr>
<tr>
</tbody>
</table>
<p class="submit clearfix">
{{ Form::submit('Update', ['class'=>'btn btn-success pull-left']) }}
{{ link_to('donors/'.$donor->username.'/profile', 'Cancel', ['class'=>'pull-right btn btn-danger']) }}
</p>
{{ Form::close() }}
请问我遗漏了什么吗? 让我知道是否应该显示我的代码的任何其他片段。
最佳答案
要进行更新,您需要稍微更改电子邮件规则。如果作为 Unique 规则的一部分,您传递要检查的字段,然后传递一个值,它不会提示该值已被占用。
在您的情况下,通过在您进行验证之前放置以下内容来更新您的 Controller :
User::$rules['email'] = 'required|email|unique:users,email,' . Input::get['email'];
您的验证现在应该通过了,因为您已经告诉 Laravel 电子邮件应该是唯一的,但您将接受当前的电子邮件地址。
关于php - 用 laravel 4.2 中输入的新值更新/替换值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24187043/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我正在尝试用ruby中的gsub函数替换字符串中的某些单词,但有时效果很好,在某些情况下会出现此错误?这种格式有什么问题吗NoMethodError(undefinedmethod`gsub!'fornil:NilClass):模型.rbclassTest"replacethisID1",WAY=>"replacethisID2andID3",DELTA=>"replacethisID4"}end另一个模型.rbclassCheck 最佳答案 啊,我找到了!gsub!是一个非常奇怪的方法。首先,它替换了字符串,所以它实际上修改了
假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我正在尝试为我的iOS应用程序设置cocoapods但是当我执行命令时:sudogemupdate--system我收到错误消息:当前已安装最新版本。中止。当我进入cocoapods的下一步时:sudogeminstallcocoapods我在MacOS10.8.5上遇到错误:ERROR:Errorinstallingcocoapods:cocoapods-trunkrequiresRubyversion>=2.0.0.我在MacOS10.9.4上尝试了同样的操作,但出现错误:ERROR:Couldnotfindavalidgem'cocoapods'(>=0),hereiswhy:U
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
这太简单了,太荒谬了,我在任何地方都找不到关于它的任何信息,包括API文档和Rails源代码:我有一个:belongs_to关联,我开始理解当您没有关联时您在Controller中调用的正常模型方法与您有关联时调用的方法略有不同。例如,我的关联在创建Controller操作时运行良好:@user=current_user@building=Building.new(params[:building])respond_todo|format|if@user.buildings.create(params[:building])#etcetera但我找不到关于更新如何工作的文档:@user
假设我在Store的模型中有这个非常简单的方法:defgeocode_addressloc=Store.geocode(address)self.lat=loc.latself.lng=loc.lngend如果我想编写一些不受地理编码服务影响的测试脚本,这些脚本可能已关闭、有限制或取决于我的互联网连接,我该如何模拟地理编码服务?如果我可以将地理编码对象传递到该方法中,那将很容易,但我不知道在这种情况下该怎么做。谢谢!特里斯坦 最佳答案 使用内置模拟和stub的rspecs,你可以做这样的事情:setupdo@subject=MyCl