我理解form_for在执行以下操作时传递给方法的内容:
<% form_for(@user) do |f| %> ... <% end %>
Run Code Online (Sandbox Code Playgroud)
if @user在控制器中设置.这很明显.
但是:user,正如我在许多例子中看到的那样,当我们通过时会发生什么?
<% form_for(:user) do |f| %> ... <% end %>
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用符号版本?
我有一个form_for表单,在其中,我正在使用表单助手复选框.该模型有一个布尔值的字段,但我希望能够在我的表单上以其相反的方式显示它,因为我认为用户更容易理解.
有没有办法让我有一个Rails表单助手操作,好像模型的布尔字段被翻转?
例:
<% form_for :user do |form| %>
<%= form.check_box :privacy_disabled %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
在此示例中,User模型具有布尔字段privacy_disabled.我想在形式检查这里显示这使得隐私.
复选框辅助函数可以设置其已检查和未选中的值,但反转这些值似乎不能正确填充带有预先保存值的复选框.
我想知道如何在form_for select上设置默认值.
我的代码是这样的:
<%= form_for(@user) do |f| %>
.
.
.
<div class="field">
<%= f.select(:user_group_id, options_for_select(@user_groups.collect {|p| [ p.name, p.id ] }, "Select Category")) %>
</div>
<%= end %>
Run Code Online (Sandbox Code Playgroud)
显然它会返回字段user_group的所有值.在我的编辑页面上,我想将默认值设置为用户在user_group中的任何值.请帮忙
我有一个模型(CustInfo),它包含3个属性:cust_name,age,gender.在我的编辑视图中,我使用form_for进行表单提交:
<%= form_for @cust[0] do |cust| %>
<label for="cname">Customer name: </label>
<%= cust.text_field :cust_name, :size => 20 %>
<label for="age">Customer age: </label>
<%= cust.text_field :age, :size => 5 %>
<label for="gender">Gender </label>
<%= radio_button_tag(:gender, "F", :checked => (:gender == 'female')? true:false) %><span style="float:left">F</span>
<%= radio_button_tag(:gender, "M", :checked => (:gender == 'male')? true:false) %><span style="float:left">M</span>
<%= cust.submit "Save" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
在我的控制器中我有
def update
if Cust.update_all(params[:custinfo])
flash[:notice] = "Successfully updated!"
redirect_to :action => "index"
else
flash[:notice] = "There are errors …Run Code Online (Sandbox Code Playgroud) 我正在使用Rails 3.1.1
我在haml视图中有以下内容:
= form_for booking.notes.build, :remote => true do |f|
= f.text_area(:content)
= f.hidden_field(:noteable_id)
= f.hidden_field(:noteable_type)
= f.submit('Add note')
Run Code Online (Sandbox Code Playgroud)
这会在提交时创建新笔记.此外,我的控制器的响应正在Chrome控制台(网络标签)中正确显示.但我似乎无法抓住回应.
我想在提交后更新页面上的注释列表.我一直试图绑定到ajax响应,所以我可以抓住响应,但我失败了.例如,我认为这应该有效,但不是:
$('#new_note').bind('ajax:success', function() {
alert('Hi');
});
Run Code Online (Sandbox Code Playgroud)
但是没有触发警报.我认为这解释了为什么这也行不通.
$('#new_note').bind("ajax:success", function(evt, data, status, xhr){
// Insert response partial into page below the form.
$(this).parent.append(xhr.responseText);
})
Run Code Online (Sandbox Code Playgroud)
你能指点一下可能出现的问题吗?
现在,每当我在用户/编辑中更改任何内容时,表单都要求用户设置新密码.我想要它需要当前密码(我怎么能要求当前密码?)只是输入了一个新密码.我怎么能实现这一点,非常感谢.
<%= form_for(@user, :html => {:multipart => true}) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<%= f.text_field :name, placeholder: :name %>
<%= f.text_field :email, placeholder: :email %>
<%= f.password_field :password, placeholder: "Enter new password" %>
<%= f.password_field :password_confirmation, placeholder: "Confirm new password" %>
<%= f.submit "Save changes", class: "btn btn-large btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud) 尝试了论坛,文档和博客建议.他们聚合语法,对我来说,没有正确保存并通过所需的控制器路由.
总的来说,我有两个共享功能的软件应用程序.为了实现共享功能,我让Rails生成Shared :: Widgets.这个MVC工作正常.使用标准共享/小部件和等路由查看,更新,创建或删除没问题.
然后,为了产品特定的功能,我创建了两个控制器:Product1 :: Widgets和Product2 :: Widgets.两者都继承自Shared :: Widgets控制器.除产品特定布局外,两者都是空的.
这个方案几乎可行.当我路由到product1/widgets时,它将layout设置为product1并调用shared/widgets的index方法.结果是显示带有product1布局的shared/widgets/index.html.erb.类似地,当我路由到product2/widgets时,这会设置product2布局并调用shared/widgets的索引方法.结果是显示带有product2布局的shared/widgets/index.html.erb.完善.
但现在我们到了form_for.因为它实现了rails魔术,所以它真的非常想直接路由到Shared :: Widgets控制器.但这不是我想要的.我希望它路由到适当的产品控制器,以便设置布局.生成form_for的rails是这样的:
form_for(@shared_widget, :html => { :class => "form"}) do |f|
Run Code Online (Sandbox Code Playgroud)
我试过了:
form_for([:product1, @widget], :html => { :class => "form"}) do |f|
Run Code Online (Sandbox Code Playgroud)
但是重复了名称空间(product1_widget_shared_widget_path).
我尝试了以下三种格式,所有这些格式似乎都正确路由,并保存记录,但记录为空(列为空):
form_for(@widget, url => "product1/widget", :html => { :class => "form"}) do |f|
form_for(@widget, url => url_for(:controller => "widget"), :html => { :class => "form"}) do |f|
form_for(@widget, url => url_for(:controller => "widget", :action => "create"), :html => { :class => "form"}) do |f| …Run Code Online (Sandbox Code Playgroud) 我正在学习Spree 3.0,我设置了一个卖短裤的测试店.
短裤有多种选择类型:尺寸,颜色,长度
我想改变它从前端复选框到下拉框显示前端变体选项的方式.
目前,Spree将选项类型显示为单选按钮:
我想更改此选项以使用每个选项类型的下拉菜单,如下所示:
我尝试过以下方法:
<%= select_tag "variant_id", options_for_select(@product.variants_and_option_values(current_currency).collect{ |v| ["#{variant_options(v)} #{variant_price(v)}", v.id] })%>
Run Code Online (Sandbox Code Playgroud)
但它只显示每个标记中所有选项类型的值:
我想知道将选项值拆分为单个下拉菜单的最佳方法吗?
任何帮助都非常感谢,谢谢.
是
<%= form_for(:product, :url => {:action => 'update', :id => @product.id})) do |f| %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)
和
<%= form_for(@product, :url => {:action => 'update', :id => @product.id})) do |f| %>
...
<% end %>
Run Code Online (Sandbox Code Playgroud)
完全相同的 ?
我无法理解两者之间的区别。有人可以解释一下使用 form_for 时的区别吗?
假设你有这个:<%= form_for(@post) do |f| %>
示例 - 你什么时候会使用这个?
<%= collection_select(:post, :author_id, Author.all, :id, :name_with_initial, prompt: true) %>
与使用这个?
<%= f.collection_select(:post, :author_id, Author.all, :id, :name_with_initial, prompt: true) %>