您可能知道,从Rails 2.2开始,Rails附带了一个简单的本地化和国际化后端.
默认情况下,您可以将要翻译的字符串存储在文件config夹中的本地化文件中.
config/locales/en.yml
config/locales/it.yml
Run Code Online (Sandbox Code Playgroud)
但Rails也提供了本地化模板和部分的能力.例如,MainController #index操作可以根据模板文件名和当前区域设置选择本地化模板.
apps/views/main/index.it.html.erb
apps/views/main/index.en.html.erb
Run Code Online (Sandbox Code Playgroud)
当您需要翻译单个字符串或短段落时,第一个功能非常有用.当相同的动作根据当前的区域设置值以不同的方式呈现时,后者是一个很好的选择.
但是,您如何处理共享相同业务逻辑但包含大量文本的公平简单模板?以下面的模板为例
<% javascript_content_for :head do %>
$(function() {
$("#choices :radio").change(function() {
$(".choice-wizard").hide();
$("#" + $(this).val()).show();
});
});
<% end %>
<h1><%= title t(".title") %></h1>
<div class="widget">
<div class="entry form">
<h2><%= title t(".header_choices") %></h1>
<% form_tag "#", :id => "choices" do %>
<p>
<%= radio_button_tag :choice, "with" %>
<%= label_tag "choice_with", "..." %>
</p>
<p>
<%= radio_button_tag :choice, "without" %>
<%= label_tag "choice_without", "..." %>
</p>
<% end %> …Run Code Online (Sandbox Code Playgroud) 这是application.html.erb文件中的调用:
<%= render :partial => 'tasks/_new' %>
Run Code Online (Sandbox Code Playgroud)
这是部分渲染(_new.html.erb):
<% form_for @task do |f| -%>
<%= f.text_field :body %>
<%= submit_tag "Submit" %>
<% end -%>
Run Code Online (Sandbox Code Playgroud)
这是'tasks'控制器中的方法:
def new
@task = Task.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @task }
end
end
Run Code Online (Sandbox Code Playgroud)
这是我一直得到的错误消息:
Missing template tasks/__new.erb in view path app/views
Run Code Online (Sandbox Code Playgroud)
它说错误在这一行:
<%= link_to "tasks", tasks_path %> <%= render :partial => 'tasks/_new' %>
Run Code Online (Sandbox Code Playgroud)
该文件位于正确的目录中.奇怪的是_文件名中有一个额外的错误.当我放弃并重命名部分时__new.erb,这是我得到的错误:
Called id for nil, which …Run Code Online (Sandbox Code Playgroud) 这可能是一个愚蠢的问题,但我似乎无法找到一个好的答案.我想知道引用一个对象所属模型的最佳方法.
例如:
class User < ActiveRecord::Base
has_many :posts
end
class Post < ActiveRecord::Base
belongs_to :users
end
Run Code Online (Sandbox Code Playgroud)
所以,为了获得用户的帖子,我可以使用user.posts,但是为了获得帖子的用户,我不能这样做:post.user
如果我向Post模型添加"用户"方法,它可以工作,但它似乎不是最好的方法.
class Post < ActiveRecord::Base
belongs_to :users
def user
User.find(self.user_id)
end
end
Run Code Online (Sandbox Code Playgroud)
如果你看这篇博客文章http://www.fortytwo.gr/blog/18/9-Essential-Rails-Tips作为例子,你可以看到作者使用post.user.username,这不起作用开箱即用以及:include => [:user],即使使用Post模型中的"user"方法也不起作用.
我知道这很简陋,所以感谢你的耐心等待.我只是想知道实现这种关系的最佳方法.
我的主要目标是使用嵌套包含来编写"查找",它会像这样引用给用户:
post = Post.find(:all,:include => [:user])
当我尝试这个时,我得到"ActiveRecord :: ConfigurationError:未找到名为'user'的关联;也许你拼错了它?"
非常感谢.
我在我的Rails应用程序中有一个模型,它使用以下:class_name属性has_one:
class Foo < ActiveRecord:Base
has_one :main_bar, :class_name => "Bar"
# ...
end
Run Code Online (Sandbox Code Playgroud)
我现在有点不确定该课程的迁移内容.我可以使用推荐信吗?Rails会将什么作为列名寻找:main_bar?我可以这样做吗?
class CreateFoos < ActiveRecord::Migration
def self.up
create_table :foos do |t|
t.references :main_bar
end
end
def self.down
drop_table :foos
end
end
Run Code Online (Sandbox Code Playgroud)
谢谢!
我正在尝试在rails应用程序中提供动态生成的文件,因此当用户单击特定链接时,将生成文件并使用send_data将其发送到客户端.
该文件不打算重复使用:是一个简短的文本文件,重新生成应该非常便宜,因为它不会被大量删除; 但如果有必要或方便我可以将它存储在数据库中,所以只生成一次.
首先,我想在内存中生成文件,并将其发送到控制器中.我试图存档这样的东西:
def DownloadsController < ApplicationController
def project_file
project = Project.find(params[:id])
send_data project.generate_really_simply_text_file_report
end
end
Run Code Online (Sandbox Code Playgroud)
但我不知道如何在内存中生成流,因此在文件系统中不会创建任何文件.
另一种选择是在rails app tmp目录中生成带有随机名称的文件并从中发送,但是文件将保留在那里,这是我不希望发生的事情.
编辑:如果我没有弄错,send_file会阻止请求直到文件被发送,所以它可以工作......
还有其他建议或意见吗?
提前致谢
在我的新电脑上,我设置了git和我的putty.exe和ssh键等等.
所以我做了一个:
git pull origin
Run Code Online (Sandbox Code Playgroud)
然后在命令提示符下,我要求输入密码.
我不知道它想要什么密码,然后它在第一次密码尝试失败后也会询问我的服务器密码.
它要求:
blahblah@serveradmin.com password:
Run Code Online (Sandbox Code Playgroud)
到底是怎么回事?
(我的git rep托管在共享的unix isp上)
我已经设置了pageant来使用我的私钥,它给了我一个弹出框来输入我的密码.这就是它在我的旧电脑上运行的方式,然后当我打开git-bash并做一个'git pull origin'时它工作正常而不问我什么.
更新II
那么让我总结一下这里发生的事情:
我在我的办公室电脑(windows7)(桌面)上有完全相同的设置,它工作正常,没有问我任何问题.我使用git做的所有b4都运行一个.bat文件来加载pageant.exe:
C:\putty\pageant.exe "E:\code\pg_pk.ppk"
Run Code Online (Sandbox Code Playgroud)
然后做一个git pull origin工作正常,不要求我输入任何密码.
我的笔记本电脑上也有这个,它就像我的办公室计算机一样直到我安装了Windows 7.现在,即使pageant.exe正在运行,它也会要求我输入密码(我可以在任务栏中看到它,并且密钥已加载).
所以今天我抓住了.bat文件和整个/ putty文件夹并把它放在我的笔记本电脑上,仍然无法正常工作,当我输入时它要求我输入密码: git pull origin
(我在两台计算机上运行相同版本的git)
真的很困惑,它会是什么?
我正在关注clickatell教程,我的代码如下所示.但是我得到了错误
uninitialized constant ActionDispatch::Routing::Routes (NameError)
from /Library/Ruby/Gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/routing/route_set.rb:258:in `instance_exec'
from /Library/Ruby/Gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/routing/route_set.rb:258:in `eval_block'
from /Library/Ruby/Gems/1.8/gems/actionpack-3.1.1/lib/action_dispatch/routing/route_set.rb:235:in `draw'
from /Users/user1/Desktop/rails_projects/clickatellsms/config/routes.rb:1
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/routes_reloader.rb:29:in `load_paths'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/routes_reloader.rb:29:in `each'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/routes_reloader.rb:29:in `load_paths'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/routes_reloader.rb:13:in `reload!'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/routes_reloader.rb:7:in `initialize'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.1/lib/active_support/file_update_checker.rb:32:in `call'
from /Library/Ruby/Gems/1.8/gems/activesupport-3.1.1/lib/active_support/file_update_checker.rb:32:in `execute_if_updated'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/finisher.rb:63
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/finisher.rb:64:in `call'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application/finisher.rb:64
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/initializable.rb:30:in `instance_exec'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/initializable.rb:30:in `run'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/initializable.rb:55:in `run_initializers'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/initializable.rb:54:in `each'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/initializable.rb:54:in `run_initializers'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/application.rb:96:in `initialize!'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/railtie/configurable.rb:30:in `send'
from /Library/Ruby/Gems/1.8/gems/railties-3.1.1/lib/rails/railtie/configurable.rb:30:in `method_missing'
from /Users/user1/Desktop/rails_projects/clickatellsms/config/environment.rb:5
from /Users/user1/Desktop/rails_projects/clickatellsms/config.ru:4:in `require'
from /Users/user1/Desktop/rails_projects/clickatellsms/config.ru:4
from /Library/Ruby/Gems/1.8/gems/rack-1.3.4/lib/rack/builder.rb:51:in `instance_eval'
from /Library/Ruby/Gems/1.8/gems/rack-1.3.4/lib/rack/builder.rb:51:in …Run Code Online (Sandbox Code Playgroud) 如果我运行以下代码,前两行将返回我所期望的.但是,第三个返回2的二进制表示.
2.to_s # => "2"
2.to_s * 2 # => "22"
2.to_s *2 # => "10"
Run Code Online (Sandbox Code Playgroud)
我知道在调用时传入2 to_s会将我的输出转换为二进制,但为什么to_s忽略*第三种情况呢?如果这有任何区别,我正在运行Ruby 1.9.2.
在我的gemfile中,我有类似的东西:
gem 'net-sftp', '2.1.1', :require => 'net/sftp'
gem 'backup', '3.0.27'
gem 'watu_table_builder', :require => 'table_builder'
gem 'browser', '0.1.6'
Run Code Online (Sandbox Code Playgroud)
在Gemfile中你需要一个要求吗?我也找到了类似的东西:require => false.救命?
假设我有一个Sidekiq任务,可以将产品处理到我的数据库.每个产品都按商店分组,因此我的代码的过于简化的例子将是这样的......
stores.each do |store|
store.products.each do |product|
ProductWorker.perform_async(product.id)
end
end
Run Code Online (Sandbox Code Playgroud)
当一家商店的所有产品都运行时.我想last_updated用当前时间更新商店列.但只有当该商店的最后一个任务运行时.我怎样才能做到这一点?
ruby ×4
bundler ×1
clickatell ×1
dynamic-data ×1
file ×1
forms ×1
gemfile ×1
git ×1
has-one ×1
include ×1
migration ×1
model ×1
reference ×1
relationship ×1
ruby-1.9.2 ×1
sidekiq ×1
sms ×1
splat ×1
templates ×1
windows ×1