我试图手动构建用户模型(不使用routes.rb文件中的'resources:users').我的routes.rb文件如下所示:
match '/users/:id', :to => 'users#show'
match '/all_users', :to => 'users#index'
Run Code Online (Sandbox Code Playgroud)
这是用户控制器中的索引方法:
def index
@title = "All users"
@users = User.paginate(:page => params[:page])
end
Run Code Online (Sandbox Code Playgroud)
这是我的索引视图:
<h1>All users</h1>
<%= will_paginate %>
<ul class="users">
<% @users.each do |user| %>
<li>
<%= link_to user.email, user %>
</li>
<% end %>
</ul>
<%= will_paginate %>
Run Code Online (Sandbox Code Playgroud)
当我点击localhost:3000/all_users时收到此错误消息:
undefined method `user_path'
Run Code Online (Sandbox Code Playgroud)
我不知道这是从哪里来的.
编辑:
好的,我发现在视图中将'user'更改为'@user'可以使它工作:
<%= link_to user.email, @user %>
Run Code Online (Sandbox Code Playgroud)
但我真的不明白错误信息,或'用户'和'@user'之间的真正区别.另外,单击创建的链接不会重定向到用户的页面,它将保留在localhost:3000/all_users上.
我正在尝试使用routes.rb文件中的以下代码将Devise与RESTful用户资源结合使用:
resources :users, :only => [:index, :show]
devise_for :users
Run Code Online (Sandbox Code Playgroud)
但是url localhost:3000/users/sign_up没有进入设计注册页面,而是产生错误"无法找到具有ID = sign_up的用户",因此它认为该url指向显示的动作用户控制器.我发现交换行的顺序会产生预期的行为:
devise_for :users
resources :users, :only => [:index, :show]
Run Code Online (Sandbox Code Playgroud)
现在,当你转到localhost:3000/users/sign_up时,你确实得到了注册页面,然后转到localhost:3000/users/1按照预期命中用户控制器的show动作.
我的问题是:正在改变这样的代码顺序正确的方法来使设计与用户资源一起工作?还是有更深层次的错误?我怀疑只是交换这两行代码不能解决问题!
在发现IE不处理javascript之后onmouseout,我决定使用jQuery代替,以便自动处理跨浏览器的兼容性.当鼠标悬停在svg路径上时,我正在创建一个由svg路径定义的区域,并且我调整了Raphael网站上提供的来自澳大利亚示例的代码.
在此代码中,澳大利亚的每个州都由拉斐尔路径定义,例如塔斯马尼亚:
aus.tas = R.path("...").attr(attr);
Run Code Online (Sandbox Code Playgroud)
然后将此路径('st')传递给函数:
st[0].onmouseover = function () {
...
};
Run Code Online (Sandbox Code Playgroud)
与我的预期相反,代码st[0].onmouseover与仅仅相反st.onmouseover.因此,路径实际上必须是一个数组,st[0]不管是什么,都是悬停的东西.
为了替换onmouseoverjQuery等价物(我相信是.mouseout()),我需要分配一个类,st[0]所以我可以用jQuery引用它.我的问题是,我该怎么做?如果代码是st.onmouseover直截了当的,但为什么path(st)是一个数组?到底是st[0]什么?我到底怎么了?
我在我的Rails应用程序文件夹'rails-apps'中的本地计算机上运行了一个功能齐全的Rails应用程序,名为'first-app'.我想在rails-apps(称为'second-app')中创建第二个应用程序,它与first-app相同,只是使用不同的名称.
我可以简单地复制并粘贴第一个应用程序并将文件夹重命名为"second-app"吗?我在整个应用程序中只发现了两个文件,其中包含术语"first-app"(application.rb和routes.rb,都在config中),因此我可能还需要更改其内容.如果这种"复制粘贴"方法是可行的,那么我是否还需要改变其他文件?
如果我必须做通常的> rails new second-app,我必须能够从first-app复制并粘贴很多文件和文件夹.我必须使用rails命令手动更改或构建哪些?
我收到此错误消息:
ERROR["test_profile_display", UsersProfileTest, 2.569931] test_profile_display#UsersProfileTest (2.57s)
NoMethodError: NoMethodError: undefined method `posts' for nil:NilClass
app/controllers/users_controller.rb:14:in `show'
test/integration/users_profile_test.rb:22:in `block in <class:UsersProfileTest>'
app/controllers/users_controller.rb:14:in `show'
test/integration/users_profile_test.rb:22:in `block in <class:UsersProfileTest>'
Run Code Online (Sandbox Code Playgroud)
似乎character在UsersController中的行@posts = @user.character.posts.paginate(page: params[:page])是nil.用户和角色之间存在多态关系.我以为我在灯具中使用了正确的语法告诉rails用户Bazley有一个灯具:在characters.yml中:
character_bazley:
sociable: bazley (user)
Run Code Online (Sandbox Code Playgroud)
如何说服rails用户夹具确实有属于它的角色?
测试/集成/ users_profile_test.rb:
require 'test_helper'
class UsersProfileTest < ActionDispatch::IntegrationTest
include ApplicationHelper
def setup
@user = users(:bazley)
end
test "profile display" do
log_in_as(@user)
get user_path(@user)
assert_template 'users/show'
assert_select 'title', full_title(@user.name)
assert_select 'h1', text: @user.name
assert_select 'h1>img.gravatar'
assert_match @user.character.posts.count.to_s, response.body
assert_select 'div.pagination'
@user.character.posts.paginate(page: 1).each do …Run Code Online (Sandbox Code Playgroud) 我有这个错误:Errno::ENOENT in PicturethingsController#update_profile.
No such file or directory - /Users/Baz/rails/myapp/public/uploads/picturething/picture/49/cat.jpg
我正在尝试复制标准图片记录并将其保存到@ character.profilepicture.我也无法将@ character.profilepicture保存到数据库中(我知道在进入rails控制台后检查).
这是令人讨厌的方法:
picturethings_controller.rb:
def update_profile
@character = Character.find_by(callsign: params[:callsign])
standardpicture = Picturething.find_by(id: params[:picid])
@character.build_profilepicture
@character.profilepicture.save!
@character.profilepicture = standardpicture.dup
@character.profilepicture.save!
@character.profilepicture.picture.recreate_versions!
@character.profilepicture.picture = @character.profilepicture.picture.profile
respond_to do |format|
format.html do
redirect_to @character.sociable
end
format.js
end
end
Run Code Online (Sandbox Code Playgroud)
character.rb:
has_many :standardpictures, class_name: "Picturething",
inverse_of: :character,
foreign_key: "character_standard_id",
dependent: :destroy
has_one :profilepicture, class_name: "Picturething",
inverse_of: :character,
foreign_key: "character_profile_id",
dependent: :destroy
Run Code Online (Sandbox Code Playgroud)
picturething.rb:
mount_uploader :picture, CharacterpicUploader
Run Code Online (Sandbox Code Playgroud) 我正在尝试设置Amazon Simple Storage Service以用于rails.我收到此错误消息:
The authorization mechanism you have provided is not supported. Please use AWS4-HMAC-SHA256.
Run Code Online (Sandbox Code Playgroud)
问题是我选择了法兰克福S3区域,并且只支持V4方案.这是在相同的错误消息这个职位,这将指导您解决 在这里,讲解如何"的设置:s3_signature_version参数:构建客户端时V4".命令是:
s3 = AWS::S3::Client.new(:s3_signature_version => :v4)
Run Code Online (Sandbox Code Playgroud)
我的问题是,我该怎么做?我在哪里放这个代码?
编辑:
我尝试:s3_signature_version => :v4按如下方式放入carrier_wave.rb,但在上传到heroku期间,它说[fog][WARNING] Unrecognized arguments: s3_signature_version,并没有任何区别,我仍然得到错误.
配置/初始化/ carrier_wave.rb:
if Rails.env.production?
CarrierWave.configure do |config|
config.fog_credentials = {
# Configuration for Amazon S3
:provider => 'AWS',
:aws_access_key_id => ENV['S3_ACCESS_KEY'],
:aws_secret_access_key => ENV['S3_SECRET_KEY'],
:s3_signature_version => :v4
}
config.fog_directory = ENV['S3_BUCKET']
end
end
Run Code Online (Sandbox Code Playgroud)
编辑:
我已经使用北加利福尼亚地区创建了一个新的存储桶,为此不应该是一个问题,但我仍然得到完全相同的错误消息.
编辑:
这也没有任何区别:
if Rails.env.production?
CarrierWave.configure do |config| …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用jQuery-File-Upload和aws-sdk gem直接在Rails中实现Amazon S3上传,并遵循heroku直接向S3上传说明.这是在html中生成的上传表单:
<form id="pic-upload"
class="directUpload"
data-form-data="{
"key":"uploads/59c99e44-6bf2-4937-9680-02c839244b33/${filename}",
"success_action_status":"201",
"acl":"public-read",
"policy":"eyJle...In1dfQ==",
"x-amz-credential":"AKIAJCOB5HQVW5IUPYGQ/20160101/us-east-1/s3/aws4_request",
"x-amz-algorithm":"AWS4-HMAC-SHA256",
"x-amz-date":"20160101T010335Z",
"x-amz-signature":"0f32ae...238e"}"
data-url="https://websmash.s3.amazonaws.com"
data-host="websmash.s3.amazonaws.com"
enctype="multipart/form-data"
action="/users/bazley/update_pictures"
accept-charset="UTF-8"
method="post">
Run Code Online (Sandbox Code Playgroud)
这是相应的jQuery:
$(function() {
$('.directUpload').find("input:file").each(function(i, elem) {
var fileInput = $(elem);
var form = $(fileInput.parents('form:first'));
var submitButton = form.find('input[type="submit"]');
var progressBar = $("<div class='bar'></div>");
var barContainer = $("<div class='progress'></div>").append(progressBar);
fileInput.after(barContainer);
fileInput.fileupload({
fileInput: fileInput,
url: form.data('url'),
type: 'POST',
autoUpload: true,
formData: form.data('form-data'),
paramName: 'file', // S3 does not like nested name fields i.e. name="user[avatar_url]"
dataType: …Run Code Online (Sandbox Code Playgroud) 单击导航抽屉中的菜单项时,它会变得稍暗并保持不变,直到单击另一个项目.我试图保持它的颜色相同,无论它处于什么状态.
它是某种叠加?我认为我已经涵盖了drawer_items.xml中的所有可能状态.
我该如何防止这种行为?
activity_main.xml中
<android.support.design.widget.NavigationView
.
.
android:background="@drawable/drawer_items"
.
app:menu="@menu/activity_main_drawer" />
Run Code Online (Sandbox Code Playgroud)
drawer_items.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/grey" android:state_activated="true" />
<item android:drawable="@color/grey" android:state_selected="true" />
<item android:drawable="@color/grey" android:state_focused="true" />
<item android:drawable="@color/grey" android:state_pressed="true" />
<item android:drawable="@color/grey" android:state_checked="true" />
<item android:drawable="@color/grey" />
</selector>
Run Code Online (Sandbox Code Playgroud)
activity_main_drawer.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:checkableBehavior="single"
android:id="@+id/arbitrary_id_1">
<item
android:id="@+id/nav_refresh"
android:icon="@drawable/ic_refresh_24dp"
android:title="Try Again/Refresh" />
</group>
<group android:checkableBehavior="single"
android:id="@+id/arbitrary_id_2">
<item
android:id="@+id/nav_back"
android:icon="@drawable/ic_fast_rewind_24dp"
android:title="Go Back" />
</group>
<group android:checkableBehavior="single"
android:id="@+id/arbitrary_id_3">
<item
android:id="@+id/nav_3" />
</group>
</menu>
Run Code Online (Sandbox Code Playgroud) 在我的Character模型中,我添加了:
character.rb
before_save do
self.profile_picture_url = asset_path('icon.png')
end
Run Code Online (Sandbox Code Playgroud)
但是,对于数据库中已存在的所有字符,它们profile_picture_url是nil.因此,我想进入控制台并遍历所有这些并设置它.在控制台我试过:
Character.find_each do |c|
c.profile_picture_url = asset_path('icon.png')
end
Run Code Online (Sandbox Code Playgroud)
但是这给出了错误:
NoMethodError: undefined method `asset_path' for main:Object
Run Code Online (Sandbox Code Playgroud)
我希望我已经充分地传达了我想要实现的目标.我哪里错了?