天道酬勤,学无止境

Ruby on Rails: Why a select box does not show the current object value?

问题

以下是来自views/products/edit.html.erb的相关代码:

<%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %>
  <%= render(:partial => "form", :locals => {:f => f}) %>
  <%= submit_tag("Update Product") %>
<% end %>

来自views/products/_form.html.erb

<%= select_with_new_option(f, :shop, :name, :id) %>

并来自helpers/products_helper.rb

def select_options_with_create_new(objects, text_field, value_field, options={})
  object = objects.to_s.singularize
  all_objects = object.capitalize.constantize.all
  all_objects = all_objects.sort_by(&options[:order_by]) if options.has_key?(:order_by)
  select_options = all_objects.map{ |obj| [obj.send(text_field), obj.send(value_field)] }
  select_options << [wrap_create_new_option("create new #{object}".titleize), "new_#{object}"]
  options_for_select(select_options)
end

def wrap_create_new_option(str)
  ">> #{str} <<"
end

# By default, sorts by 'text_field'.
def select_with_new_option(f, object, text_field, value_field)
  f.select(:"#{object}_id", select_options_with_create_new(object.pluralize, text_field, value_field, :order_by => text_field))
end

我希望选择框默认为@product.shop_id ,但事实并非如此(第一个选项始终是默认值)。

我错过了什么?

回答1

好吧,我明白了。 只需删除select_options_with_create_new方法中的options_for_select(select_options)即可。

options_for_select将 2-d 数组select_options成一个 html 选项字符串, select表单助手可以接受该字符串,但是不分配selected属性。 只需将二维数组作为第二个参数传递给select方法,它将自动分配selected的对象。

回答2

我认为,在这种情况下,您需要做的就是确保在edit操作中设置@product

def edit
  @product = Product.find(params[:id])
end

然后改变你的第一行:

<%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %>

<%= form_for(@product, :url => {:action => 'update', :id => @product.id}) do |f| %>

第一个代码块肯定会更新正确的产品,但是如果您生成一个带有@product变量集的form_for @product ,您只会看到反映的当前值。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Ruby on Rails: Why a select box does not show the current object value?
    Here is the relevant code from views/products/edit.html.erb: <%= form_for(:product, :url => {:action => 'update', :id => @product.id}) do |f| %> <%= render(:partial => "form", :locals => {:f => f}) %> <%= submit_tag("Update Product") %> <% end %> from views/products/_form.html.erb: <%= select_with_new_option(f, :shop, :name, :id) %> and from helpers/products_helper.rb: def select_options_with_create_new(objects, text_field, value_field, options={}) object = objects.to_s.singularize all_objects = object.capitalize.constantize.all all_objects = all_objects.sort_by(&options[:order_by]) if options
  • 我想使用 .find() 和 Ruby on Rails 返回单个结果(I want to return a single result using .find() with Ruby on Rails)
    问题 我有一个用户视图和一个租赁视图。 在我的租赁视图中,我试图显示当前用户名。 我想我已经很接近了,但我无法解决最后一点。 这将在选择列表中返回我的所有用户 <%= f.select :user_id, User.find(:all).collect {|t| [t.user_name, t.id]} %> 这将返回我当前的用户 ID <%= f.number_field :user_id %> 所以我想我可以做类似的事情 <%= f.select :user_id, User.find(:user_id).collect {|t| [t.user_name, t.id]} %> 我只想在选择列表中返回当前用户,并将他们的 id 作为值和他们在列表中的名称。 如果我执行上述操作,它会告诉我 Couldn't find User with id=user_id 所以 user_id 作为文字字符串传递,但我想传递 user_id 变量,它应该是 10 之类的东西。我不知道如何将 user_id 作为变量传递。 我对 ROR 还很陌生,我可能会以完全错误的方式解决这个问题。 任何帮助深表感谢。 回答1 我假设您有一个租赁对象,您为其显示表单,我假设它是一个实例变量@rental ,此外我假设在您的Rental类中有以下关系 class Rental belongs_to :user
  • Ruby on Rails:根据选择框的更改将表单作为 JS 提交(Ruby on Rails: Submit a form as a JS based on a change in select box)
    问题 我在 Rails 中通过form_tag和select_tag生成了以下 HTML: <form accept-charset="UTF-8" action="/deployment_group/show_workflow_list" data-remote="true" id="show_workflow_list_form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div> <select id="folder_name_foldernames" name="folder_name[foldernames]"> <option value="RISK_ODS" selected="selected">RISK_ODS</option> <option value="DETAIL_ADJUSTMENT">DETAIL_ADJUSTMENT</option> <option value="ODS_STAGE">ODS_STAGE</option> <option value="FINANCE_DM1">FINANCE_DM1</option> </select> </form> 让我知道我需要编写的
  • Localizing a text field containing a number in Ruby on Rails
    I am currently working on a project to internationalize one of our ruby-on-rails web applications so that it can be used in other countries (France will be the first one in this case). A particular issue I haven't worked out yet is with the displaying of numeric fields. When displaying numbers for display purposes only, I do the following: <%= number_to_percentage(tax.rate, :precision => 2)%> In English, this shows 17.50, but in French it shows 17,50 (with a comma in place of the decimal point) which is as expected. The problem comes in the Edit form, when I show a text field <%= f.text_field
  • Why does the Rails command force a help message for the `new` command?
    Strangely, I cannot execute typical Rails commands in certain situations, such as rails s and rails c. I have found that this occurs on a certain feature branch, and has also occasionally occurred in the past as well, but currently works on my develop branch. I reversed any .rb files that could be loaded and have any effect, but that didn't help, and the other other changes are .sh files and readme updates. Text I do not want to see: > rails Usage: rails new APP_PATH [options] Options: -r, [--ruby=PATH] # Path to the Ruby binary of your choice # Default: /Users/jsmall/.rvm/rubies/ruby-2.1.5
  • 为什么 Rails 命令强制为 `new` 命令提供帮助信息?(Why does the Rails command force a help message for the `new` command?)
    问题 奇怪的是,在某些情况下,我无法执行典型的 Rails 命令,例如rails s和rails c 。 我发现这发生在某个功能分支上,过去也偶尔发生过,但目前在我的develop分支上有效。 我反转了任何可以加载并产生任何效果的.rb文件,但这没有帮助,其他其他更改是.sh文件和自述文件更新。 我不想看到的文字: > rails Usage: rails new APP_PATH [options] Options: -r, [--ruby=PATH] # Path to the Ruby binary of your choice # Default: /Users/jsmall/.rvm/rubies/ruby-2.1.5/bin/ruby -b, [--builder=BUILDER] # Path to a application builder (can be a filesystem path or URL) -m, [--template=TEMPLATE] # Path to an application template (can be a filesystem path or URL) [--skip-gemfile], [--no-skip-gemfile] # Don't create a Gemfile [--skip-bundle], [--no
  • Rails - grouped_options_for_select
    I am having some difficulty populating a select box in Rails with option groups using grouped_options_for_select. I currently have 3 instance variables that I would like to add to one entire grouped array for the grouped select box. For example, I have: @fruits (which contains the object(s)) --- !ruby/object:Fruits attributes: id: 2 name: Banana @veggies (which contains the object(s)) --- !ruby/object:Veggies attributes: id: 23 name: Celery --- !ruby/object:Veggies attributes: id: 24 name: Carrots @junk_food (which contains the object(s)) --- !ruby/object:Junk attributes: id: 11 name: Snickers
  • Ruby on Rails: Submit a form as a JS based on a change in select box
    I have the following HTML generated by form_tag and select_tag in Rails: <form accept-charset="UTF-8" action="/deployment_group/show_workflow_list" data-remote="true" id="show_workflow_list_form" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /></div> <select id="folder_name_foldernames" name="folder_name[foldernames]"> <option value="RISK_ODS" selected="selected">RISK_ODS</option> <option value="DETAIL_ADJUSTMENT">DETAIL_ADJUSTMENT</option> <option value="ODS_STAGE">ODS_STAGE</option> <option value="FINANCE_DM1">FINANCE_DM1</option> <
  • 如何在Ruby on Rails中使ActiveRecord显示下一个ID(上一个+ 1)?(How do I get ActiveRecord to show the next id (last + 1) in Ruby on Rails?)
    问题 如果将对象持久化到数据库中,ActiveRecord是否有一种紧凑的方法来查询下一步将使用什么ID? 在SQL中,这样的查询如下所示: SELECT max(id) + 1 FROM some_table; 回答1 这是Taryn East的版本的略微修改: Model.maximum(:id).next 回答2 在接受无花果的答案时,我可能想提请您注意一件小事。 如果要在保存之前将下一个ID设置为特定记录,我认为这不是一个好主意。 因为以基于Web的系统为例 您得到的最后一个ID为10 您将下一个ID设置为11 在保存记录之前,其他人已经保存了记录,现在最后一个id同样应该是12。 我不确定您是否希望最后一个ID执行我在这里想的事情,但是如果是这样,这只是为了引起您的注意。 回答3 如果您的数据库是Postgres,则可以使用此获取下一个ID(例如名为“ users”的表的示例): ActiveRecord::Base.connection.execute("select last_value from users_id_seq").first["last_value"] 与其他答案不同,此值不受记录删除的影响。 可能有一个等效的mySQL,但是我没有一个要确认的设置。 如果您已将数据导入到Postgresql数据库中
  • Rails - grouped_options_for_select(Rails - grouped_options_for_select)
    问题
  • 多选菜单和虚拟属性(Multi Select menus and Virtual Attributes)
    问题 我有包含 start_at:datetime end_at:datetime 的周期表。 因为每个时期都在同一日期开始和结束,所以我想将它们分成三个字段而不是两个字段。 字段1:日期字段2:开始时间“00:00”字段3:结束时间“00:00” 我开始并完成了这项工作。 但不幸的是,我遇到了一个问题。 所以请看一下周期模型,表格和错误,纠正我,纠正代码。 提前致谢! 时期模型 class Period < ActiveRecord::Base belongs_to :show def show_date; start_at.nil? ? Time.now.to_date : start_at.to_date; end def start_at_time; start_at.nil? ? Time.now.to_time : start_at.to_time; end def end_at_time; end_at.nil? ? Time.now.to_time : end_at.to_time; end def start_at_time=(start_str) self.start_at = DateTime.parse("#{show_date.strftime("%Y-%m-%d")}T#{start_str.strftime("%H:%M:%S")}") end def
  • Rails 4:如何使用 AJAX 更新索引页面(Rails 4: How to update index page with AJAX)
    问题 我不敢相信我还没有找到其他问题来回答这个问题,但我搜索了高低,找不到任何能真正回答我的问题的东西。 基本上,我有一个费用页面,我想在其中显示给定月份中所有费用的表格。 我有一个月份和年份选择,现在我通过向 url 添加月份和年份参数并使用一点 javascript 转到该 href 来使其工作。 然而,我想避免页面刷新,并且只在选择框值更改时更新表。 据我了解,因为我没有使用表单,所以我不能使用:remote => true ,因此必须使用 AJAX。 我的研究使我将事情设置如下。 这是我的带有 AJAX 调用的 JQuery: $(document).ready(function() { $('#monthSelect').change(function() { // alert("yay"); var m = $(this).val(); var y = $("#yearSelect").val(); $.ajax({ type: "GET", url: "/expenses", data: { month : m, year : y } , success: function(data) { }, dataType: "json" }); }); }); #monthSelect和#yearSelect是我的两个选择框的 ID。 这部分似乎有效。
  • Ruby on Rails and Active Record standalone scripts disagree on database values for :timestamps
    I posted a question earlier today when I'd not zeroed in quite so far on the problem. I'll be able to be more concise here. I'm running RoR 2.1.2, on Windows, with MySQL. The SQL server's native time zone is UTC. My local timezone is Pacific (-0800) I have a model with a :timestamp type column which I can do things like this with: record = Record.find(:first) record.the_time = Time.now() When I do a "select * from records" in the database, the time shown is eight hours in advance of my local time, which is correct, given that the DB is on UTC. (I have verified that it is 'thinking in utc' with
  • 如何在Mac上将Ruby更新到1.9.x?(How to update Ruby to 1.9.x on Mac?)
    问题 我在Mac上创建了一个新的用户帐户,并且尝试从雪豹默认值1.8.7更新到它的当前版本的红宝石(1.9.2)。 有人可以指出我的教程或解释将Mac上的Ruby从1.8更新到1.9.2的最佳方法吗? 谢谢 回答1 我会为rvm提出一个强烈的建议。 这是在不与系统版本冲突的情况下管理多个红宝石和宝石集的好方法。 我现在要补充一点(2013年4月2日),我经常使用rbenv,因为我的需求很简单。 RVM很棒,但是它具有很多我从未需要的功能,因此我在某些计算机上拥有它,在台式机和笔记本电脑上具有rbenv。 两者都值得一试,看看哪种最适合您的需求。 回答2 正如Tin Man所建议的那样(上方) RVM ( Ruby版本管理器)是在OSX上升级Ruby安装的标准:https://rvm.io 首先,请打开“终端窗口”并发出以下命令: \curl -L https://get.rvm.io | bash -s stable --ruby (你需要信任RVM Dev Team的命令是没有恶意的-如果你是一个偏执的企鹅像我一样,你可以随时去阅读源:https://github.com/wayneeseguin/rvm)当它完成您需要重新启动终端才能使rvm命令正常工作。 rvm list known (向您显示Ruby的最新可用版本) rvm install ruby-2.3.1
  • 如何在 ruby​​ on rails 应用程序中单击带有水豚的单选按钮(How to click radio button with capybara in ruby on rails app)
    问题 我正在尝试使用水豚选择一个单选按钮,但它找不到单选按钮。 这是我的 rspec 测试、视图和错误。 请注意,我将工厂用于用户、技能等。 Rspec测试 scenario "user chooses a couple skills and moves on to bio" do user = create(:user) skill = create(:skill) skill_two = create(:skill) skill_three = create(:skill) sign_in(user) visit onboard_skills_path choose(skill.name) end 看法 <%= form_for(:onboard_skill, url: onboard_skills_path) do |f| %> <ul> <% @skills.each do |skill| %> <li> <%= check_box_tag("skill_ids[]", skill.id, current_user.onboard_skill_ids.include?(skill.id)) %> <%= f.label(skill.name) %> </li> <% end %> </ul> <%= f.submit "Next >", class: "submit
  • Millisecond resolution of DateTime in Ruby
    问题 我有一个类似2012-01-01T01:02:03.456的字符串,我使用 ActiveRecord 将其存储在 Postgres 数据库 TIMESTAMP 中。 不幸的是,Ruby 似乎减少了毫秒: ruby-1.9.3-rc1 :078 > '2012-12-31T01:01:01.232323+3'.to_datetime => Mon, 31 Dec 2012 01:01:01 +0300 Postgrs 支持微秒级分辨率。 如何相应地保存我的时间戳? 我至少需要毫秒分辨率。 (PS 是的,我可以在 postgres 中破解毫秒整数列;这违背了 ActiveRecord 的全部目的。) 更新: 非常有用的响应表明 Ruby 的DateTime并没有减少毫秒; 使用#to_f显示它。 但是,做: m.happened_at = '2012-01-01T00:00:00.32323'.to_datetime m.save! m.reload m.happened_at.to_f 确实会减少毫秒。 现在,有趣的是created_at在 Rails 和 Postgres 中都显示毫秒。 但其他时间戳字段(如上面的happened_at的_at)没有。 (也许 Rails 对created_at使用NOW()函数,而不是传入 DateTime)。 这导致了我的终极问题:
  • Ajax flash message in ruby on rails
    I'm trying to show a flash message and render it with Ajax, but the message does not seem to be appearing until after I refresh the page. Here's my create.rjs file: page.insert_html :top, :feed_items, :partial => 'shared/feed_item', :object => @micropost page.replace_html :user_info, pluralize(current_user.microposts.count, "micropost") page[:micropost_form].reset page.replace_html :notice, flash[:notice] flash.discard Here's the relevant part of my application layout view: <div id= "notice"><% flash.each do |key, value| %> <div class="flash <%= key %>"><%= value %></div> <% end %></div> And
  • 为什么 Ruby on Rails 的操作“销毁”不命名为“删除”?(Why the Ruby on Rails action “destroy” is not named “delete”?)
    问题 CRUD 原则定义了对持久数据的四个基本操作: 创造, 读, 更新, 删除。 HTTP 动词也使用 DELETE 词。 为什么 Rails 中的默认路由使用单词“ destroy ”来表示对应于 HTTP 动词DELETE 的操作? 回答1 Rails 使用 4 种标准方法(动词),即: 得到邮政放删除 除此之外,它还有 7 个 RESTful 操作: 指数新的创造编辑更新表演破坏 Rails 从不使用与相应动作相同的动词。 路由到操作 destroy 可以通过控制器中的相应操作执行多个 DELETE。 您可能会对这个 railsguide 感兴趣:http://guides.rubyonrails.org/routing.html 解释 浏览器通过使用特定的 HTTP 方法(例如 GET、POST、PUT 和 DELETE)请求 URL 来从 Rails 请求页面。 每个方法都是对资源执行操作的请求。 资源路由将许多相关请求映射到单个控制器中的操作。 现在,假设我们有一个 HTTP GET 请求,这意味着您要读取/检索数据。 如果动作与动词同名,在本例中为 GET,那就过于简单了。 GET 可以访问显示、索引、新建或编辑操作。 他们都是读取数据,但动作本身肯定不一样。 关于 DELETE 请求也可以这样说。 这个请求是通过控制器处理的,并且在动作中可以有不同的实现。
  • 复选框以在 Rails 上发送电子邮件 ruby(Check box to send email ruby on rails)
    问题
  • 创建失败时Ruby on Rails Active Record返回值?(Ruby on Rails Active Record return value when create fails?)
    问题 我是 ruby​​ on rails 的新手,无法完成这项工作。 基本上我有一个用户注册页面,其中有一个密码确认。 在 User 类中,我有以下验证: validates :password, confirmation: true 在控制器中我有 def create vals = params[:user] if(User.exists(vals[:username])) flash[:warning] = "#{vals[:username]} already exists! Please try a new one. " else vals[:create_date] = DateTime.current user = User.create(vals, :without_protection => :true) if user==false or user==nil or user==vals flash[:warning] = "#{vals[:username]} has not been registered successfully. " else flash[:notice] = "#{vals[:username]} has been registered. " end end redirect_to users_path end