- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用的是 ruby 1.9.3 和rails 4.1。
我对 ruby 很陌生,以前没有任何 JavaScript 知识。
我有几个简单的有很多关系和一个有很多通过关系。
class Service < ActiveRecord::Base
has_many :websites, :dependent => :destroy
has_many :timetables, :dependent => :destroy
has_many :service_places, :dependent => :destroy
has_many :places, through: :service_places
end
class ServicePlace < ActiveRecord::Base
belongs_to :service
belongs_to :place
end
class Website < ActiveRecord::Base
belongs_to :service
end
class Place < ActiveRecord::Base
has_many :service_places
has_many :services, through: :service_places
end
class Timetable < ActiveRecord::Base
belongs_to :service
end
我已经在服务表单(_form.html.erb)中为每个呈现良好的关联创建了嵌套表单,所有 CRUD 功能都可以工作。
<%= form_for(@service, :html => {:class => "form-horizontal", :role => "form"}) do |f| %>
<%= render 'wcc_style/layouts/error_messages', object: @service %>
<!-- I've skipped some of the html for the service details to just rendering the forms... -->
<!-- Adds the Service_Places associations -->
<%= f.fields_for :service_places do |service_places| %>
<%= render "service_place_fields", :f => service_places %>
<%end %>
<!-- Adds the website associations via a partial -->
<%= f.fields_for :websites do |website| %>
<%= render "website_fields", :f => website %>
<%end %>
<%= link_to_add_fields "Add a website", f, :websites, "btn btn-default", "Add a new website" %>
<!-- Adds the timetables associations via a partial -->
<%=f.fields_for :timetables do |timetable| %>
<%= render "timetable_fields", :f => timetable %>
<%end %>
<%= f.submit 'Save', :class => 'btn btn-primary' %>
<%= link_to 'Cancel', services_path, :class => "btn btn-default", :role =>"button" %>
<% end %>
网站部分示例 (_website_fields.html.erb)
<!-- This partial holds the websites information for main service form -->
<div class="form-group">
<%= f.label :website, :class=>'col-sm-2 control-label' %>
<div class="col-sm-4">
<%= f.text_field :url, :class => "form-control", :placeholder => "Service Provider Website" %>
</div>
</div>
我现在想做的是添加功能,以便在添加\编辑服务记录时能够添加和删除与服务相关的项目(例如网站、时间表、service_places)。我看过很多与此相关的帖子,但没有看到使用 jquery 和 Rails 4 的良好工作解决方案。
对此进行了一些研究,我发现了旧的 Railcast 196 和 197。它们已经过时,并且在 Rails 4 中不起作用。更多研究表明命令已贬值。我看到有一个较新版本的railscasts,我还没有看过。我确实阅读了修订版的评论,它表明它使用了coffescript,尽管我无法确认这一点。
我还看到了使用 cocoon gem 和nested_form_fields 的其他潜在解决方案的链接。两者似乎都使用我不熟悉的 HAML。
我尝试使用 jquery 来完成此操作,以帮助我理解 javascript 流程(因为我需要在开发完成后支持开发,而我们的标准是尽可能使用 JQuery)。
我已经成功地获得了添加类型的工作,因为它在第一次按下时呈现网站标签和复选框,但随后的点击只是在消失之前再次呈现大约一秒钟。这个位置也不是我所期望的,在页面顶部,但我确信这取决于我们自己处理 CSS 的样式 gem 。我认为 javascript 不应该执行 POST,但它似乎是这样做的,因为它会在每次单击按钮时清除我的其他字段。
我的第一个问题是如何获得添加功能来添加新项目而不清除服务表单中的其他项目?
我的第二个问题是如何让删除功能发挥作用。我假设删除必须在部分表单生成器内(例如,每个项目删除一个)。
我在下面包含了应用程序帮助程序和 javascript(从各个帖子拼凑而成)。
application_helper.rb 模块应用程序助手
#def link_to_remove_fields(name, f)
# f.hidden_field(:destroy) + link_to_function(name, "remove_fields(this)")
#end
# remove link doesn't work!!!!!!!!!
def link_to_remove_fields(name, f)
f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
end
# This now sort of works but the field disappears when it is created after about a second. It also appears at the top of the page.
def link_to_add_fields(name, f, association, cssClass, title)
new_object = f.object.class.reflect_on_association(association).klass.new
fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
render(association.to_s.singularize + "_fields", :f => builder)
end
link_to name, "#", :onclick => h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"), :class => cssClass, :title => title
end
end
application.js
function remove_fields(link) {
$(link).prev("input[type=hidden]").val("1");
$(link).closest(".fields").hide();
}
function add_fields(link, association, content) {
var new_id = new Date().getTime();
var regexp = new RegExp("new_" + association, "g")
$(link).parent().before(content.replace(regexp, new_id));
}
services_controller.rb
class ServicesController < ApplicationController
# Set the service record before each action
before_action :set_service, only: [:show, :edit, :update, :destroy]
################################################################################
# Create
################################################################################
def create
@service = Service.new(service_params)
respond_to do |format|
if @service.save
format.html { redirect_to @service, notice: 'Service was successfully created.' }
format.json { render action: 'show', status: :created, location: @service }
else
@service.websites.build
@service.timetables.build
@service.service_places.build
format.html { render action: 'new' }
format.json { render json: @service.errors, status: :unprocessable_entity }
end
end
end
################################################################################
# Delete
################################################################################
def destroy
@service.destroy
respond_to do |format|
format.html { redirect_to services_url , notice: 'Service was successfully deleted.' }
format.json { head :no_content }
end
end
################################################################################
# Edit
################################################################################
def edit
@service.websites.build
@service.timetables.build
@service.service_places.build
end
################################################################################
# Index
################################################################################
def index
@services = Service.order(:service_number).page params[:page]
end
################################################################################
# New
################################################################################
def new
@service = Service.new
@service.websites.build
@service.timetables.build
@service.service_places.build
end
################################################################################
# Search
################################################################################
def search
@search_term = params[:search_term]
if @search_term && @search_term.strip.empty?
redirect_to root_path
else
@services = Service.search(@search_term).order(:service_number).page params[:page]
end
end
################################################################################
# Show
################################################################################
def show
end
################################################################################
# Update
################################################################################
def update
respond_to do |format|
if @service.update(service_params)
format.html { redirect_to @service, notice: 'Service was successfully updated.' }
format.json { head :no_content }
else
format.html { render action: 'edit' }
format.json { render json: @service.errors, status: :unprocessable_entity }
end
end
end
################################################################################
# Private methods
################################################################################
private
# Use callbacks to share common setup or constraints between actions.
def set_service
@service = Service.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def service_params
params.require(:service).permit(:service_number, :operator, :monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday, :bank_holiday, :search_term, websites_attributes: [:id, :service_id, :url, :_destroy], timetables_attributes: [:id, :service_id, :url, :_destroy], service_places_attributes: [:id, :service_id, :position, :place_id, :_destroy], places_attributes: [:id, :place_name, :active, :_destroy])
end
end
在互联网上搜索后,我似乎找不到任何关于如何使用 jquery 和标准 ruby\rails 使其工作的链接。有谁知道任何有助于实现这一目标的链接或资源?
我并不反对使用 cocoon 或nested_form_fields 这样的 gem,假设我可以将 HAML 转换为 ERB,将 Coffeescript 转换为 javascript。作为 ruby\rails 和 javascript 的新手,让构建者做一些事情很棒,但是当出现问题时,我不知道如何修复它。
我感谢任何帮助或指导。
最佳答案
由于进展缓慢,我按照同事的建议使用了 cocoon。我按照这里的步骤操作:cocoon gem on github并设法让它发挥作用。我知道这并不能回答我的实际问题,但它确实为我提供了一种做我想做的事情的方法。我已经为其他人记录了这些步骤,以防他们觉得有用。我还将 HAML 转换为普通的 ruby,因为我对此更满意。
1) 将以下行添加到您的 gemfile 中:
gem "cocoon"
2) 将以下行添加到您的 app/assets/javascripts/application.js 文件中
//= require cocoon
3)修改我的服务表格(_form.html.erb)如下
<%= form_for(@service, :html => {:class => "form-horizontal", :role => "form"}) do |f| %>
<%= render 'wcc_style/layouts/error_messages', object: @service %>
<div class="form-group">
<%= f.label :service_number, :class=>'col-sm-2 control-label' %>
<div class="col-sm-3">
<%= f.text_field :service_number, :class => "form-control", :placeholder => "Service Number" %>
</div>
</div>
<div class="form-group">
<%= f.label :operator, :class=>'col-sm-2 control-label' %>
<div class="col-sm-4">
<%= f.text_field :operator, :class => "form-control", :placeholder => "Operator" %>
</div>
</div>
<div class="form-group">
<%= f.label :monday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :monday, :class => "form-control, pull-left", :placeholder => "Monday" %>
</div>
</div>
<div class="form-group">
<%= f.label :tuesday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :tuesday, :class => "form-control, pull-left", :placeholder => "Tuesday" %>
</div>
</div>
<div class="form-group">
<%= f.label :wednesday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :wednesday, :class => "form-control, pull-left", :placeholder => "Wednesday" %>
</div>
</div>
<div class="form-group">
<%= f.label :thursday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :thursday, :class => "form-control, pull-left", :placeholder => "thursday" %>
</div>
</div>
<div class="form-group">
<%= f.label :friday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :friday, :class => "form-control, pull-left", :placeholder => "Friday" %>
</div>
</div>
<div class="form-group">
<%= f.label :saturday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :saturday, :class => "form-control, pull-left", :placeholder => "Saturday" %>
</div>
</div>
<div class="form-group">
<%= f.label :sunday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :sunday, :class => "form-control, pull-left", :placeholder => "Sunday" %>
</div>
</div>
<div class="form-group">
<%= f.label :bank_holiday, :class=>'col-sm-2 control-label' %>
<div class="col-sm-2">
<%= f.check_box :bank_holiday, :class => "form-control, pull-left", :placeholder => "Bank Holiday" %>
</div>
</div>
<h3>Stops</h3>
<!-- Adds the Service_Places associations via partial (sort applied in model) -->
<div>
<%= f.fields_for :service_places do |service_places| %>
<%= render 'service_place_fields', :f => service_places %>
<% end %>
<div class="links">
<%= link_to_add_association 'add service places', f, :service_places, :class => "btn btn-default" %>
</div>
</div>
<h3>Websites</h3>
<!-- Adds the website associations via a partial -->
<div>
<%= f.fields_for :websites do |website| %>
<%= render "website_fields", :f => website %>
<%end %>
<div class="links">
<%= link_to_add_association 'add websites', f, :websites, :class => "btn btn-default" %>
</div>
</div>
<h3>Timetables</h3>
<!-- Adds the timetables associations via a partial -->
<div>
<%=f.fields_for :timetables do |timetable| %>
<%= render "timetable_fields", :f => timetable %>
<%end %>
<div class="links">
<%= link_to_add_association 'add timetables', f, :timetables, :class => "btn btn-default" %>
</div>
</div>
<br>
<%= f.submit 'Save', :class => 'btn btn-primary' %>
<%= link_to 'Cancel', services_path, :class => "btn btn-default", :role =>"button" %>
<% end %>
4) 将部分内容修改为如下所示。它需要 class="nested-fields"否则它将无法工作。
<div class="nested-fields">
<%= f.label :website, :class=>'col-sm-2 control-label' %>
<div class="col-sm-4">
<%= f.text_field :url, :class => "form-control", :placeholder => "Service Provider Website" %>
</div>
<div>
<%= link_to_remove_association "remove website", f, :class => "btn btn-default" %>
</div>
</div>
我没有包含所有部分内容,但它们遵循相同的格式。
关于jquery - 使用 Rails 4 和 JQuery 添加\删除嵌套表单中的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26138798/
我在 mongodb 中的玩家和锦标赛之间存在多对多关系。 我希望能够一次将许多玩家添加到锦标赛中。如果没有 ajax,这很简单,但我们有一个包含数千名玩家的数据库,因此表单选择变得巨大。 我们想为此
这个问题已经有答案了: When should I use html's and when spring's in Spring MVC web app? (3 个回答) 已关闭 6 年前。 我正
我正在 C++ Builder XE4 上使用 VCL。 我有以下组件。 FormMain 具有 TButton *B_select; FormSelect(或DialogSelect)具有 TCom
如何在不影响表单控件的情况下更改表单的 alphablend? 德尔福XE7 最佳答案 此问题的一个解决方案是使用多设备应用程序(如果无法使用VCL)。 如果您需要保留透明的TForm,只需更改属性T
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我正在尝试扩展 Django 注册以包含我自己的注册表单。原则上这是相当简单的。我只需要编写自己的表单( CustomRegistrationForm ),它是原始表单( RegistrationFo
我正在尝试为我的网站实现聊天功能。为了做到这一点,我遵循了以下教程:https://channels.readthedocs.io/en/latest/tutorial/ 然后我稍微更改了代码以实现它
有一个问题,我需要用一个 html 表单提交两个相互关联的模型表单。我知道如何提交两个单独的表格,但是在相关模型表格的情况下外键让我发疯。 问题是,第二个表单应该用外键填充字段到第一个表单的实例。 在
我正在创建一个工具,允许某人输入食谱,然后将其保存为 XML 文件,我已经创建了 XSD,但我想知道如何在我的网页上制作一个表单以允许用户输入他们的食谱并遵守模式。我一直在研究 Ajax 和 Jque
在 .net win 表单(如 asp.net web 表单)中是否有可用的验证控件? 因为很难为我的每个控件设置正确的条件,所以我的表单中也有很多重复的代码。 正确的做法是什么? 最佳答案 看看这个
我有一个简短的问题。我正在学习如何使用 javascript 制作注册表,发现此链接非常有用。 http://www.w3resource.com/javascript/form/javascript
我正在开发一个项目,该项目将使用循环将许多表单添加到 mysql 数据库中。在 javascript 部分中,我无法让 var i 在函数 updatesum() 中工作。有人可以帮我吗? 我试图避免
在我的应用程序上有一个包含 2 个字段和一个保存按钮的表单。 在我的 onClick 结束时我需要什么来将光标返回到第一个字段。 我有这个来清除它们 txtData.setText("
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
<input type="text" name="textfield" onKeyPress="javascript:alert(event.
我正在构建的网站有一个登录表单,作为所有其他模板扩展的 base.html 模板的一部分;因此,我需要以某种方式处理每个页面上的登录/注销逻辑。 目前每个页面都在单独的 View 中加载,那么实现它的
我有一个表单类,看起来像.. #forms.py class ExampleForm(forms.Form): color = forms.CharField(max_length=25)
有没有办法在表单定义中给表单一个特殊的错误渲染函数?在 customizing-the-error-list-format 下的文档中它展示了如何为表单提供特殊的错误呈现函数,但似乎您必须在实例化表单
我正在处理由多个页面组成的表单,我想解决验证问题。 当我点击提交按钮时,当前页面上的所有字段都会在下方显示错误消息,但是如果我更改页面,那么我需要再次点击提交,因为这些字段未设置为已触摸。 如果我可以
是否可以附加到继承表单的 exclude 或 widgets 变量? 到目前为止,我有以下设置。 class AddPropertyForm(forms.ModelForm): num_mon
我是一名优秀的程序员,十分优秀!