小编Asa*_*uhi的帖子

rake db:create vs rake db:create:all

rake db:create和之间有什么区别rake db:create:all
两者同样用于为Rails应用程序创建数据库.
关于我可以找到的Rails rake的最详尽的信息是在教程点,但缺少上述命令.

rake ruby-on-rails

8
推荐指数
1
解决办法
5044
查看次数

#{} 总是等于 to_s 吗?

在“使用类名进行字符串插值意味着什么? ”中,Candide 建议在#{}字符串内部隐式调用to_s. 因此,例如:

my_array = [1, 2, 3, 4]
p my_array.to_s # => "[1, 2, 3, 4]"
p "#{my_array}" # => "[1, 2, 3, 4]"
Run Code Online (Sandbox Code Playgroud)

但是,如果to_sfor Array 重新定义如下所示,我会得到不同的结果:

class Array
  def to_s
    self.map { |elem| elem.to_s }
  end
end

p my_array.to_s # => ["1", "2", "3", "4"]
p "#{my_array}" # => "#<Array:0x007f74924c2bc0>"
Run Code Online (Sandbox Code Playgroud)

我想这种情况随时都会发生,而且无论如何 to_s都会被覆盖。

如果可能的话,我应该做什么来保持字符串中的to_s表达式之间的相等性?#{}

我在RubyMonk 课程中遇到了这个问题:根据课程 #{ogres}应该返回什么,根据我的经验是不同的。

ruby string-interpolation

5
推荐指数
1
解决办法
4087
查看次数

为什么控制器需要实例变量来使用ajax

在rails教程的第12.2.5节中,引入了Ajax以"在不离开页面的情况下异步发送请求到服务器".respond_to然后在控制器中使用该方法,以允许具有启用的javascript的浏览器使用Ajax,或者在禁用Ajax的情况下使用重定向进行响应.

用于在两个用户之间创建关系的表单是:

<%= form_for(current_user.active_relationships.build, remote: true) do |f| %>
  <div><%= hidden_field_tag :followed_id, @user.id %></div>
  <%= f.submit "Follow", class: "btn btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

关系控制器中的相应操作是:

  def create
    @user = User.find(params[:followed_id])
    current_user.follow(@user)
    respond_to do |format|
      format.html { redirect_to @user }
      format.js
    end
  end
Run Code Online (Sandbox Code Playgroud)

使Rails有机会使用Ajax的方法是remote: trueform_forhelper方法中添加.根据教程,控制器必须使用实例变量@user而不是局部变量user在表单中使用remote: true.

如果没有Ajax,除了remote: true代码缺失之外,生成的表单将是相同的,并且在控制器中respond_to,代码部分将被redirect_to替换; 而且,实例变量@user可以被局部变量替换user,因此create动作将是:

  def create
    user = User.find(params[:followed_id])
    current_user.follow(user)
    redirect_to user
  end
Run Code Online (Sandbox Code Playgroud)

我想知道:为什么控制器必须使用 …

ajax ruby-on-rails railstutorial.org

4
推荐指数
1
解决办法
143
查看次数

AWS S3 IAM策略,用于对单个存储桶执行读写权限

在Michael Hartl'Rails教程的第11.4.4节" 生产中图像上传 "中,建议使用Amazon Web Services S3作为云存储服务.在页面底部的一个注释中,作者自己将本书的这一部分定义为"具有挑战性",并且还表明它"可以跳过而不会失去连续性".

实际上,本节最具挑战性的部分之一是找到一个合适的IAM策略,该策略可以附加到AWS的IAM用户,以便授予IAM用户对S3存储桶的读写权限.

我发现在Stackoverflow上这是一个常见问题:例如,请参阅" 尝试设置Amazon的S3存储桶:403禁止错误和设置权限 ".

实际上,Amazon Web Services针对需要对单个S3存储桶具有读写权限的应用程序的解决方案不起作用,并且尝试上载图像的用户从Heroku的AWS服务器接收403禁止状态.

预定义的"AmazonS3FullAccess"策略确实有效,但不应将其视为最终解决方案,因为不需要向IAM用户授予过多权限,因此也不需要向应用程序授予权限,而且我认为也可能是安全漏洞.

那么正确的IAM政策是什么?

ruby-on-rails heroku amazon-s3 railstutorial.org

2
推荐指数
1
解决办法
2424
查看次数

错误:分支“升级”未完全合并

我最近从 Bitbucket 克隆了我的应用程序并签出到一个新upgrading分支,在该分支中我将应用程序从 Rails 5.0.0.1 升级到了 Rails 5.1.6:

$ git checkout -b upgrading
Run Code Online (Sandbox Code Playgroud)

我首先更新了我的 Gemfile,我运行了捆绑更新:

$ bundle update
Run Code Online (Sandbox Code Playgroud)

railsdiff网站和为此目的创建的新rails 5.1.6应用程序中,我编辑了旧应用程序,添加或删除代码以及删除或创建文件,并编辑了指定要继承的类版本的迁移文件。然后我在运行之前使用 git 提交了我的应用程序rails app:update

$ git add -A
$ git commit -m 'before rails app update'
$ rails app:update
Run Code Online (Sandbox Code Playgroud)

需要进行一些更改,然后我重置数据库并运行整个测试套件:

$ rails db:migrate:reset
$ rails test
Run Code Online (Sandbox Code Playgroud)

我播种了数据库,启动了服务器并以图形方式测试了应用程序。一切都很好。最后我做了一次提交,切换到主分支,挤压合并了升级分支,最后进行了最后一次提交:

$ git add -A
$ git commit -m "work in progress"
$ git checkout master 
$ git merge --squash upgrading
$ git commit -m "upgrade to Rails 5.1.6" …
Run Code Online (Sandbox Code Playgroud)

git ruby-on-rails

2
推荐指数
1
解决办法
2327
查看次数

如何拒绝具有不需要的数字范围的数组

我需要创建一个方法,它应该只接收1到6之间的数字数组作为参数.如果参数不同,我想用错误消息退出方法.

这里解释什么方法得分(骰子)

我想过使用双条件子句,例如:

if (dice.is_a? Array ) && ("elements of dice are numbers of range (1..6)")
do something
else print "error message"
Run Code Online (Sandbox Code Playgroud)

代替字符串"骰子的元素是范围的数字(1..6)"我尝试了以下代码,但不起作用:

dice.each { |num| num <= 6 }
Run Code Online (Sandbox Code Playgroud)

你会建议什么?

ruby arrays

1
推荐指数
1
解决办法
69
查看次数

如何从created_at列中仅提取年份

查询数据库中的created_at值会得到以下输出:

>> kevin.created_at
=> Sun, 21 Aug 2016 07:46:26 UTC +00:00
Run Code Online (Sandbox Code Playgroud)

如何从这些信息中仅提取年份?
我试着把它kevin.created_at视为一个字符串,看看我能不能得到我想要的东西:

>> kevin.created_at.split[3].to_i
Run Code Online (Sandbox Code Playgroud)

但是我收到这条消息:

NoMethodError: undefined method `split' for Sun, 21 Aug 2016 07:46:26 UTC +00:00:Time
Run Code Online (Sandbox Code Playgroud)

所以我试过:

>> kevin.created_at.to_a
=> [26, 46, 7, 21, 8, 2016, 0, 234, false, "UTC"]
Run Code Online (Sandbox Code Playgroud)

所以我可能有一个解决方案:

>> kevin.created_at.to_a[5]
=> 2016
Run Code Online (Sandbox Code Playgroud)

有没有更好或更优雅的解决方案来查询Postgresql获取此信息?

postgresql datetime ruby-on-rails

1
推荐指数
2
解决办法
6944
查看次数

Ruby on Rails 和 Sendinblue 通过 SMTP

我想使用 Sendinblue 通过 SMTP 从我的 Ruby on Rails Web 应用程序发送事务电子邮件。我编辑config/environments/production.rb如下:

ActionMailer::Base.smtp_settings = {
  :address => 'smtp-relay.sendinblue.com',
  :port => '587',
  :authentication => :plain,
  :user_name => ???,
  :password => ???,
  :domain => 'fireworks.com',
  :enable_starttls_auto => true
}
Run Code Online (Sandbox Code Playgroud)

我应该使用什么 asuser_namepassword?我的帐户的用户名和密码还是我的 SMTP 密钥?另外,我是否需要使用任何 gem,例如sib-api-v3-sdk,或者该 gem 仅适用于使用 Sendinblue API 发送电子邮件?

ruby-on-rails sendinblue

1
推荐指数
1
解决办法
1945
查看次数

使用类的名称进行字符串插值是什么意思?

以下代码是rubykoans about_classes.rb的摘录:

class Dog7
  def initialize(initial_name)
    @name = initial_name
  end
  def to_s
    @name
  end
end
Run Code Online (Sandbox Code Playgroud)

我创建了一个实例Dog7:

fido = Dog7.new("Fido")
Run Code Online (Sandbox Code Playgroud)

我理解以下内容:

"My dog is " + fido.to_s # => "My dog is Fido"
"My dog is #{fido.to_s}" # => "My dog is Fido"
Run Code Online (Sandbox Code Playgroud)

我不明白为什么以下插值有意义并给出相同的结果:

"My dog is #{fido}" # => "My dog is Fido"
Run Code Online (Sandbox Code Playgroud)

fido 不是一个字符串.

ruby string-interpolation

0
推荐指数
1
解决办法
83
查看次数

Ruby:如何检查文件是否仍然打开?

Ruby的文档报告使用File.open和块自动关闭文件,否则建议使用close方法显式关闭文件.据说,如果有人忘记在后一种情况下关闭文件,该文件将保持打开状态.如何检查文件是否仍然打开并最终关闭?

如果我决定使用IO类打开文件并使用IO.new(fd)创建新的I/O流:

fd = IO.sysopen("file.txt", "a")
myios = IO.new(fd)
myios.puts "new line"
Run Code Online (Sandbox Code Playgroud)

一旦代码执行,流会自动关闭吗?我怎么检查呢?ObjectSpace.each_object(IO)的使用无助于理解在执行代码后,垃圾收集器或Ruby是否关闭了myios流.

ruby io

0
推荐指数
1
解决办法
3800
查看次数