我在rails应用程序中一直有这个问题,我仍然需要正确的解决方案.每当用户编辑自己的记录时,都会填充密码字段.我怀疑它的Firefox在编辑操作中设置@ user.password = nil没有帮助.
问题是未填充密码确认,因此由于未匹配而验证失败.
我尝试过以下方法:
<%= f.label :password %>
<%= f.password_field :password, :value => "", :autofill => false, :class => 'max' %>
Run Code Online (Sandbox Code Playgroud)
但那不行.我也试过:autofill => 'off'哪个也行不通.
有人有什么建议吗?谢谢.
我有一个button_to,我想执行PUT操作(只有一件事可以更新有关此资源 - 它将被更新为'已确认',因此没有其他表单字段与触发操作相关联).
这是在我看来(控制器是明确给出的,因为按钮位于属于另一个控制器的视图上):
<%= button_to "Acknowledged", :controller => 'practice_sessions', :id => @practice_session.id, :method => :put %>
Run Code Online (Sandbox Code Playgroud)
在我的路由文件中,资源已被声明为restful资源:
resources :practice_sessions
Run Code Online (Sandbox Code Playgroud)
此资源的控制器具有创建和更新操作,上面的button_to调用create操作.我希望它调用更新操作.
这是通过创建操作触发之前的日志来实现的:
Started POST "/practice_sessions?id=21&method=put" for 127.0.0.1 at 2010-11-17 08:52:46 +0000
Processing by PracticeSessionsController#create as HTML
Parameters: {"authenticity_token"=>"1EW0IlI38d0f4wST5azrCEZVZPfih7i0UvCGSF7eqbc=", "id"=>"21", "method"=>"put"}
Run Code Online (Sandbox Code Playgroud) 所以我正在使用rails 3.1构建一个表单
<%= simple_nested_form_for(@person, :url => collection_url, :html=>{:multipart => true}) do |f| %>
<%= render :partial => "form", :locals => { :f => f } %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
但部分中的这一行导致了问题:
<h2>Badges</h2>
<ul id="certifications">
// this following line is raising the error "wrong number of arguments (4 for 3)"
<%= f.fields_for :certifications do |certification_form| %>
<%= render :partial => 'certification', :locals => { :f => certification_form } %>
<% end %>
</ul>
<%= f.link_to_add "Add a Badge", :certifications %>
Run Code Online (Sandbox Code Playgroud)
所以这是模型:
class …Run Code Online (Sandbox Code Playgroud) ruby-on-rails actionview nested-forms nested-attributes simple-form
无论如何从传入的html_tag元素上升DOM树?
ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
# implementation
end
Run Code Online (Sandbox Code Playgroud)
无论如何我可以实现这个方法来提升DOM树并在父div上放置一个类吗?
例如:
<div class="email">
<label for="user_email">Email Address</label>
<input id="user_email" name="user[email]" size="30" type="text" value="">
</div>
Run Code Online (Sandbox Code Playgroud)
我想在div.email上放一个类,而不是直接在输入/标签上放置一些东西.
这可以使用field_error_proc方法完成还是有一个干净的替代方案?
我想避免在我对每个表单字段的视图中明确地这样做.(如下)
.email{:class => object.errors[:email].present? 'foo' : nil}
=form.label :email
=form.text_field :email
Run Code Online (Sandbox Code Playgroud)
仅供参考:对我的问题的简短回答是,无法在field_error_proc方法中访问DOM的其他部分.这是因为这些方法实际上并没有构建DOM,而只是将一堆字符串连接在一起.有关可能的解决方法的信息,请阅读以下解决方案.
更新:
问题解决了
我不得不把protect_from_forgery在Users控制器中.谢谢大家.
Rails 4.0.2
当我尝试在users表中创建新记录时,我在浏览器中收到此消息:
ActionController::InvalidAuthenticityToken in UsersController#create
ActionController::InvalidAuthenticityToken
Run Code Online (Sandbox Code Playgroud)
但它发生在Chrome(32.0.1700.107)和Opera(12.16)浏览器中.在Firefox(27.0.1)和IE 10.0.13中,一切正常.也许没关系,但我不得不说,我也使用has_secure_password(bcrypt_ruby).
Rails日志:
...
Started POST "/users" for 127.0.0.1 at 2014-02-19 10:26:05 +0400
Processing by UsersController#create as HTML
Parameters: {"utf8"=>"?", "authenticity_token"=>"93jpgxCSY3XzZkIJKraOodyObBoaPoPMVz3RiOVBL10=", "user"=>{"name"=>"", "surname"=>"", "patronymic"=>"", "email"=>"", "address"=>"", "phone"=>"", "phone2"=>"", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"??????? ????????????"}
Can't verify CSRF token authenticity
Completed 422 Unprocessable Entity in 2ms
ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):
actionpack (4.0.2) lib/action_controller/metal/request_forgery_protection.rb:163:in `handle_unverified_request'
actionpack (4.0.2) lib/action_controller/metal/request_forgery_protection.rb:170:in `handle_unverified_request'
actionpack (4.0.2) lib/action_controller/metal/request_forgery_protection.rb:177:in `verify_authenticity_token'
...
Run Code Online (Sandbox Code Playgroud)
查看文件users/new.html.slim:
= stylesheet_link_tag 'users' …Run Code Online (Sandbox Code Playgroud) 我认为应该有一个简单的解决方案,因为Rails 2.3具有这种新奇的嵌套表单功能.基本上我想创建或更新用户并同时为他们分配角色.
看起来我正在做的一切正确,但我收到错误警告:无法批量分配这些受保护的属性:roles_attrributes.
我甚至尝试将视图更改为用户[permissions_attrributes] [role_id],因为我认为连接表可能会让Rails感到困惑.
无论如何,关于这应该如何实际工作的任何建议?
模型
class User < ActiveRecord::Base
has_many :permissions
has_many :roles, :through => :permissions
accepts_nested_attributes_for :roles
accepts_nested_attributes_for :permissions
end
Run Code Online (Sandbox Code Playgroud)
从视图中摘录(注意我试过并且没有得到fields_for来生成我想要的东西,也许那是我的问题?)
<% for role in Role.all %>
<%= check_box_tag( "user[roles_attrributes][id]",role.id) %>
<%= role.rolename %>
<br/>
<% end %>
Run Code Online (Sandbox Code Playgroud)
遇到的参数似乎是正确的:
{"user"=>{"password_confirmation"=>"[FILTERED]",
"roles_attrributes"=>{"id"=>"2"}, ...
Run Code Online (Sandbox Code Playgroud)
解决方案我错误拼写的组合,不使用attr_accessible,需要访问permissions_attributes,并且表单稍微关闭.
模型:
has_many :permissions, :dependent => :destroy
has_many :roles, :through => :permissions
accepts_nested_attributes_for :permissions
attr_accessible :permissions_attributes
Run Code Online (Sandbox Code Playgroud)
视图:
<% Role.all(:order => "rolename ASC").each_with_index do |role,idx| %>
<%= check_box_tag( "user[permissions_attributes][#{idx}][role_id]",role.id) %>
<%= role.rolename %> …Run Code Online (Sandbox Code Playgroud) 在给定某个AJAX请求的情况下,我正试图以动态创建表单元素.
这是我的设置:
视图:
<%= link_to 'Next', check_unique_id_students_path, :remote => true %>
<div id="guardian_student_details"></div>
Run Code Online (Sandbox Code Playgroud)
控制器:
def check_unique_id
@student = Student.new
@this_form = ActionView::Helpers::FormBuilder.new(:student, @student, @template, {}, proc{})
end
Run Code Online (Sandbox Code Playgroud)
JS:
jQuery("#guardian_student_details").html("<%=escape_javascript(render :partial => "student_details", :locals => { :s => @this_form }) %>");
Run Code Online (Sandbox Code Playgroud)
部分:
<% puts s.text_field :first_name %>
<% puts s.field_helpers %>
Run Code Online (Sandbox Code Playgroud)
出于调试目的,我在部分的开头放置了以下行:
<% puts s.class.to_s %>
<% puts s.object.to_s %>
Run Code Online (Sandbox Code Playgroud)
打印出:
ActionView::Helpers::FormBuilder
Student
Run Code Online (Sandbox Code Playgroud)
这应该工作.但是rails会出现以下错误:
ActionView::Template::Error (undefined method `text_field' for nil:NilClass):
1: <% puts s.class.to_s %>
2: <p>
3: <%= s.text_field :first_name, …Run Code Online (Sandbox Code Playgroud) forms ruby-on-rails actionview formbuilder ruby-on-rails-3.1
升级到Rails 3.1.0并遵循David Rice的说明后,我的所有控制器都奇怪地找不到他们的意见了.
# rails s #
Started GET "/units" for 127.0.0.1 at 2011-09-04 07:52:23 -0400
Unit Load (0.1ms) SELECT "units".* FROM "units"
ActionView::MissingTemplate (Missing template units/index, application/index with {:handlers=>[:erb, :builder], :formats=>[:html], :locale=>[:en, :en]}. Searched in:
):
app/controllers/units_controller.rb:9:in `index'
Run Code Online (Sandbox Code Playgroud)
units_controller.rb:
# GET /units
# GET /units.xml
def index
@units = Unit.all
respond_to do |format|
format.html # index.html.erb
format.xml { render :xml => @units }
end
end
Run Code Online (Sandbox Code Playgroud)
当然,视图在那里(/app/views/units/index.html.erb;它在升级之前工作).我觉得这是一个愚蠢的错误,我在这里错过了什么?
我正在尝试在我的应用中实现刷新按钮,以允许用户手动重新同步到Web服务器.代码有效,但我无法弄清楚动作视图(至少,我认为这是我应该使用的).
我的菜单项目在这里:
<item
android:id="@+id/main_menu_refresh"
android:enabled="true"
android:icon="@drawable/refresh"
android:orderInCategory="1"
android:showAsAction="ifRoom"
android:title="@string/refresh"
android:actionViewClass="android.widget.ProgressBar">
</item>
Run Code Online (Sandbox Code Playgroud)
问题是,它总是显示ProgressBar.我想知道它是否像搜索小部件(我真正在网上看到的唯一例子)一样工作,并将collapseActionView标签添加到showAsAction并且阻止它立即显示.但是,当我单击刷新按钮时,图标会消失(好),但操作栏中的标题也会消失,并且ProgressBar会出现在标题所在的窗口左侧.也不是我想要的.
作为最后的努力,我试图将其添加到我的代码中,并actionViewClass从XML中删除:
MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
Log.w("MyApp", "Have Menu");
ProgressBar pb = new ProgressBar(ReadingList.this);
refresh.setActionView(pb);
Run Code Online (Sandbox Code Playgroud)
这也没用,给我一个空指针错误setActionView.
我需要一个可以从任何函数调用的解决方案(开头有一个自动同步周期,我希望ProgressBar也可以显示),然后能够将它返回到它的静态图标.
我尝试阅读这个问题,但我无法理解答案意味着什么.我觉得我试图按照它说的做,但我想不是.非常感谢任何帮助.
编辑:对于sastraxi的建议.
public class IconSwitcher extends LinearLayout{
public IconSwitcher(Context context) {
super(context);
ProgressBar pb = new ProgressBar(context);
ImageView iv = new ImageView(context);
addView(iv);
addView(pb);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,这是我的班级.但是,当我尝试引用它时:
MenuItem refresh = (MenuItem)findViewById(R.id.main_menu_refresh);
IconSwitcher ic = (IconSwitcher) refresh.getActionView();
Run Code Online (Sandbox Code Playgroud)
我得到一个空指针错误.创建IconSwitcher.按钮XML如下:
<item
android:id="@+id/main_menu_refresh"
android:enabled="true"
android:icon="@drawable/refresh"
android:orderInCategory="1" …Run Code Online (Sandbox Code Playgroud) 假设我有一个Person类和一个Gang类
class Person
belongs_to :gang
attr_accessible :name, :secret
def to_builder
Jbuilder.new do |app|
person.id id
person.name name
end
end
end
class Gang
has_many :people
attr_accessible :name
end
Run Code Online (Sandbox Code Playgroud)
如何从视图中使用此to_builder方法?
例如
#app/views/gang/show.json.jbuilder (@gang set by the controller)
json.gang do |json|
json.name @gang.name
json.gang_members(@gang.people) do |person|
#how do I delegate to the person.to_builder here?
end
end
Run Code Online (Sandbox Code Playgroud)
请注意,我不想只使用默认的Person.as_json,因为我不想secret在Person上呈现属性.
我尝试过的大多数事情最终都是渲染了Person.as_json,而不是Person.to_builder.
actionview ×10
forms ×2
ruby ×2
activerecord ×1
android ×1
associations ×1
dom ×1
formbuilder ×1
jbuilder ×1
nested-forms ×1
parsing ×1
simple-form ×1
webforms ×1