我有一个控制器farms_controller
,用于两个不同的路由,farms
和person_farms
;两条路线对视图模板使用相同的文件夹(即new_person_farm_path
和new_farm_path
使用相同的模板new.html.erb
)。我想分别在人员注册表中访问农场注册页面,其中一些功能在不同的测试中使用URL来显示不同的功能(通过request.env['PATH_INFO'].include? 'person_farms'
,因为我不知道最好的方式)。
当我从new_person_farm_path
提交没有必填字段(名称)的情况时,创建函数会为new_farm_path
页面呈现不同样式的不正确字段(使用' twitter-bootstrap- rails' gem)。我希望它改为呈现new_person_farm_path
页面,使用相同的模板文件,但使用不同的路由(不同的URL)。我尝试使用redirect_to
,它会在正确的网址中显示该网页,但不会显示错误字段中的样式。
但是,我在Rails documentation for rendering中看到的所有说明都在上面呈现特定文件,但它不是我需要的。我觉得它不是" Rails方式",但我是RoR的首发,这是一个被重写为Rails的遗留系统,所以我不能现在更正数据库逻辑。
那么,有没有办法从同一个控制器渲染视图但使用不同的路径?
我的代码:
def create
@farm = Farm.new(farm_params)
respond_to do |format|
if @farm.save
# Param sent by the page to test if I'm in a person_farms page
# instead of a farms page because the request.env test doesn't work here.
# I feel that this is not the correct way to do that, but I can leave the correct way to another question.
# However, if someone has a suggestion a comment would be appreciated.
if params[:is_person_farm_page]
format.html { redirect_to @person_farm_path(@farm), notice: 'Farm saved' }
format.json { render :show, status: :created, location: @farm }
else
format.html { redirect_to @farm, notice: 'Farm saved' }
format.json { render :show, status: :created, location: @farm }
end
else
#This is the point where I want to redirect to new_person_farm_path
#I would need to test using the params[:is_person_farm_page] above
format.html { render :new }
format.json { render json: @farm.errors, status: :unprocessable_entity }
end
end
end
答案 0 :(得分:0)
在路径中发送参数,如:
new_person_farm_path(param_1: 'my param')
然后在控制器中,您可以使用以下命令访问该值:
params[:param_1]
并将其作为实例变量或(如果您使用的话)传递给视图:
@show_some_part = params[:param_1].present? # This can be a boolean or something else
现在在您的视图中,您可以要求该值
<%= something if @show_some_part %>
答案 1 :(得分:0)
为了解决我的具体问题(重定向到正确的new
页面,但有错误字段),我做了这个解决方案(如果你从一开始就这样做可能不是最好的,但我已经有很多了功能正常,我想将person_farm_path
和farm_path
保持为不同的网址:
在我的控制器中,我使用了此主题的第一个答案:Rails: I cant pass a validation error in a redirect,因此我在create
操作中插入了此代码:
if @farm.save
... #the same code in my question
else
if params[:is_person_farm_page]
#pass the errors messages via flash, "imploding" the array of errors into a string
format.html { redirect_to new_person_farm_path, :flash => { :error => flash_errors = @farm.errors.full_messages.join(',')}}
format.json { render json: @farm.errors, status: :unprocessable_entity }
else
format.html { render :new }
format.json { render json: @farm.errors, status: :unprocessable_entity }
end
end
现在我可以通过重定向操作传递错误,而不是渲染操作。
然后,在form.html.erb
中,我只需要“爆炸”新数组中发送的字符串:
<% errors_sent_via_flask = flash[:error] ? flash[:error].split(",") : [] %>
为了查看我可以获得的所有errors_message,我使用<%= errors_sent_via_flask .inspect %>
(这与页面中的所有数组成员相呼应)并模拟错误情况并提交表单。例如,缺少名称字段的错误消息类似于“场名称不能为空”。
现在,我可以使用页面中的errors_sent_via_flask.include? "Farm name can't be blank"
检查“服务器名称是否为空”错误。