Rails 初学者,\n不知何故,我找不到在创建记录后重定向用户的方法。
\n\n我有这个控制器:
\n\n def create\n @product = Product.new(product_params)\n\n respond_to do |format|\n if @product.save\n format.html { redirect_to @product, notice: \'Product successfully created\' }\n else\n format.html { render :new, notice: \'Error\' }\n end\n end\n end\n\n def product_params\n params.require(:product).permit(:name, :description, :price, :quantity, :status, :image)\n end\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试过一些变体,例如redirect_to product_path(@product)删除format块,但没有任何效果。用于提交值的模型和表单似乎有效(验证已通过,记录已保存)。
日志:
\n\nParameters: {"..."}\n User Load (0.2ms) SELECT ....\n \xe2\x86\xb3 app/controllers/application_controller.rb:15:in \'admin?\'\n (0.1ms) BEGIN\n \xe2\x86\xb3 app/controllers/products_controller.rb:24:in \'block in create\'\n Product Exists? (0.4ms) SELECT 1 ...\n \xe2\x86\xb3 app/controllers/products_controller.rb:24:in \'block …Run Code Online (Sandbox Code Playgroud) 我刚刚开始使用 Docker,一切都在顺利进行,直到我尝试访问我的超级基本应用程序的页面。我懂了:
web_1 | [Webpacker] Compiling...
web_1 | [Webpacker] Compilation failed:
web_1 | ERROR: [Errno 21] Is a directory: 'bin'
web_1 | CRITICAL:root:Traceback (most recent call last):
web_1 | File "/usr/lib/python2.7/dist-packages/cliapp/app.py", line 182, in _run
web_1 | self.settings.load_configs()
web_1 | File "/usr/lib/python2.7/dist-packages/cliapp/settings.py", line 829, in load_configs
web_1 | self._read_ini(pathname, f)
web_1 | File "/usr/lib/python2.7/dist-packages/cliapp/settings.py", line 838, in _read_ini
web_1 | cp.readfp(f)
web_1 | File "/usr/lib/python2.7/ConfigParser.py", line 324, in readfp
web_1 | self._read(fp, filename)
web_1 | File "/usr/lib/python2.7/ConfigParser.py", line 512, in …Run Code Online (Sandbox Code Playgroud) 我正在SimpleForm 5.0.2与 ActionText 一起使用。
我希望表单的主体字段为多行(比如 10 行),但我不知道如何让它工作。
这是我目前的尝试:
<%= f.rich_text_area :body, class: 'form-control', name: "article-text", input_html: { rows: 10 }, placeholder: "Enter your article body here..." %>
Run Code Online (Sandbox Code Playgroud)
这会生成以下 HTML:
<trix-editor class="form-control" input_html="{:rows=>10}" placeholder="Enter your article body here..." id="article_body" input="article_body_trix_input_article" data-direct-upload-url="http://localhost:3000/rails/active_storage/direct_uploads" data-blob-url-template="http://localhost:3000/rails/active_storage/blobs/:signed_id/:filename" contenteditable="" role="textbox" trix-id="1" toolbar="trix-toolbar-1"></trix-editor>
Run Code Online (Sandbox Code Playgroud)
看起来像这样:
请注意,我还尝试了各种迭代input_html:,包括但不限于:
<%= ... input_html: { 'rows': '10' } ... %>
<%= ... input_html: { rows: "10" } ... %>
Run Code Online (Sandbox Code Playgroud)
一切都无济于事。
我怎样才能让它发挥作用?
我正在努力将新的 Rails 6 应用程序部署到 Heroku。它在我本地运行良好。在部署过程中,我收到以下输出。
不幸的是,我对 webpack 和 Yarn 还很陌生。这似乎是 move-file 的版本/依赖关系问题,而 move-file 又似乎是 webpacker 的依赖关系。但是,我不知道如何解决这个问题。
似乎可以归结为这一行:
error move-file@2.0.0: The engine "node" is incompatible with this module. Expected version ">=10.17". Got "10.15.3"
Run Code Online (Sandbox Code Playgroud)
但是,节点不是我的节点模块之一,但似乎是已安装的二进制文件。当我跑步时
node - v
Run Code Online (Sandbox Code Playgroud)
我得到:v12.16.1
任何帮助将不胜感激。
remote: Removing bundler (2.0.2)
remote: Bundle completed (201.39s)
remote: Cleaning up the bundler cache.
remote: -----> Installing node-v10.15.3-linux-x64
remote: -----> Installing yarn-v1.16.0
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote: Running: rake assets:precompile
remote: yarn install …Run Code Online (Sandbox Code Playgroud) 安装好的导轨6.0.3。Ran rails new [app],启动服务器,加载主页,服务器日志显示此路由错误。有任何想法吗?这是我没有碰过的路线文件。
Rails.application.routes.draw do
# For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html
end
Run Code Online (Sandbox Code Playgroud) 我有以下2个型号:
class Offer < ApplicationRecord
has_many :bookings
end
class Booking < ApplicationRecord
belongs_to :offer
end
Run Code Online (Sandbox Code Playgroud)
当我尝试保存没有 Offer_id 的 Booking 对象时,Rails 会抛出验证错误“需要 Offer”。
但我不会主动验证关联对象是否存在(我打算稍后为此关联添加条件验证)。
这是否意味着 Rails 6 默认情况下会验证所有关联的存在?如果是,我怎样才能使这样的验证成为有条件的?
如何让 Rails 生成主密钥?我希望它在生产环境中解密凭据文件。
这就是我尝试生成新密钥的方法:
config$ rm credentials.yml.enc
config$ EDITOR=vim rails credentials:edit
File encrypted and saved.
Run Code Online (Sandbox Code Playgroud) 我正在尝试将隐藏字段添加到form_with.
以下是 3 次尝试(以及结果/错误消息)
来自: https: //guides.rubyonrails.org/form_helpers.html
<%= hide_field_tag(:parent_id, "5") %>
所以我尝试:
<%= form_with(model: @message, method: :post) do |f| %>
<%= f.label :body %>
<%= f.text_area :body %>
<%= f.hidden_field_tag :user_id, current_user.id %>
<%= f.submit "Send", class: "btn btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
来自: https: //api.rubyonrails.org/v6.0.3/classes/ActionView/Helpers/FormHelper.html#method-i-hidden_ field
示例:hidden_field(:signup, :pass_confirm)
所以我尝试
<%= f.label :body %>
<%= f.text_area :body %>
<%= f.hidden_field :user_id, current_user.id %>
<%= f.submit "Send", class: "btn btn-primary" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
但
这比其他两次尝试更进一步,因为至少显示视图加载而不是出错。 …
在一个简单的预订应用程序中:
TempAppointment会创建一个。无法首先创建约会记录,因为乘客可能不付款,在这种情况下,临时约会保持不变,并且永远不会创建关联的约会记录。
我的自然想法是 TempAppointment has_one Appointment (有效),但是当我添加时optional: true,我看到错误:
class TempAppointment < ApplicationRecord
has_one :appointment, optional: true
end
Run Code Online (Sandbox Code Playgroud)
尝试创建一个新的临时约会
ta = TempAppointment.new(cruise_id: 1, passenger_id: 1, start_time: start_time, end_time: start_time + 3600)
ArgumentError: Unknown key: :optional. Valid keys are: :class_name, :anonymous_class, :foreign_key,
:validate, :autosave, :foreign_type, :dependent, :primary_key, :inverse_of, :required, :as, :touch
Run Code Online (Sandbox Code Playgroud)
为什么不能has_one与 一起工作optional: true?
我注意到用户可以访问他们不应该访问的操作。
我在 Rails 控制台中用类似的东西进行了调试
user = User.first
physician = Physician.first
ability = Ability.new(user)
ability.can?(:send_message, physician)
# => false
Run Code Online (Sandbox Code Playgroud)
上面说用户无法访问该医生的 send_message 操作,这是所需的行为,但我知道他们可以在应用程序中!
我认为这缩小了 cancancan 由于某种原因加载错误模型实例的问题的原因。cancan 文档中也暗示了这一点:
注意:这假设模型实例已正确加载。
但问题是我不确定如何从这里诊断问题,因为控制台说它应该可以工作。我不知道如何查看cancancan设置的模型实例,也不知道还能尝试什么。
有任何想法吗?
我确实设法通过authorize! :send_message, physician在控制器中使用来解决这个问题,但由于我只是偶然发现了这种行为,我认为弄清楚为什么加载了错误的模型实例更为重要(特别是这样我可以看看这是否是其他地方也发生过)。
我认为发生这种情况是因为我有很多自定义操作,有些有@physician = Physician.find(current_user.physician.id)(即他们是当前用户),而其他则更像是@physician = Physician.find_by_id(physician_params[:id]). 我不确定cancan如何设置实例模型,但我知道它不是通灵的,所以它不知道是否将其设置为当前用户的医生实例,或者传入的医生id的医生实例。
cancancan 如何为自定义方法设置模型实例(我认为它会尝试一些方法,如果不起作用,则尝试其他方法,等等)?
有帮助的小注释:
load_and_authorize_resource 确实尝试加载模型实例以进行非 RESTful 操作当我返回鼻涕虫时,它打破了这种行为,我可以编辑所有神奇宝贝。
ruby-on-rails-6 ×10
ruby ×2
actiontext ×1
activerecord ×1
associations ×1
cancan ×1
cancancan ×1
docker ×1
form-with ×1
has-one ×1
heroku ×1
node.js ×1
precompile ×1
simple-form ×1
trix ×1
validation ×1
webpacker ×1
yarnpkg ×1