【发布时间】:2018-07-06 11:01:28
【问题描述】:
这个问题是关于 Rails 中新的 form_with 助手的。特殊情况是表单适用于 belongs_to 另一个模型。这是一些代码。
Routes.rb
resources :contents do
resources :translations
end
迁移
class CreateTranslations < ActiveRecord::Migration[5.2]
def change
create_table :translations do |t|
t.text :translation
t.string :to_lang
t.references :content, foreign_key: true, dependent: :delete
t.timestamps
end
end
end
表格
<%= form_with(model: @translation, url: [@content, @translation], local: true) do |form| %>
<% if translation.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(translation.errors.count, "error") %> prohibited this translation from being saved:</h2>
<ul>
<% translation.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label "Target Language", class: "label" %>
<div class="select">
<%= form.select(:to_lang, options_for_select([["English", "en"], ["French", "fr"], ["Spanish", "es"]])) %>
</div>
</div>
<div class="field">
<%= form.label "Original Content" %>
<%= form.label translation.content.text %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>
Translation_controller.rb
def new
@content = Content.find(params[:content_id])
@translation = @content.translations.new
end
def create
@content = Content.find(params[:content_id])
@translation = @content.translations.build(translation_params)
respond_to do |format|
if @translation.save
format.html { redirect_to contents_path, notice: 'Translation was successfully created.' }
format.json { render :show, status: :created, location: @translation }
else
format.html { render :new }
format.json { render json: @translation.errors, status: :unprocessable_entity }
end
end
end
问题
这段代码似乎可以工作,但我认为我可以改进它。当我查看创建操作中的参数时,我看到:
<ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"dFdTw+d85qA2BsLb0OW4TcaVfkMIaNEYgXcPvE8ff5ANprfoL58clGlx5kSC5zzoSOM0nSf9kaNvH8ebpUj5JQ==", "translation"=>{"to_lang"=>"en"}, "commit"=>"Create Translation", "controller"=>"translations", "action"=>"create", "content_id"=>"1"} permitted: false>
- 如您所见,content_id 参数不在 translation => hash 参数下,这使得我的强参数找不到它。有没有更好的方法?
其次,这导致我编写这样的创建操作:
@content = Content.find(params[:content_id])
@translation = @content.translations.build(translation_params)
- 这似乎不对,因为我再次绕过了强大的参数。我知道这纯粹是一个美学问题,我认为不会损害安全性或其他什么。有没有更好的方法?
我的 form_with 也是这样的:
<%= form_with(model: @translation, url: [@content, @translation], local: true) do |form| %>
- 我主要是通过谷歌搜索和反复试验得到的。这是最佳做法吗?
【问题讨论】:
标签: ruby-on-rails